Toma este ejemplo:

SomeClass.h

class Foo {
public:
    static int bar;
    int x;
    void someFunc() {
        this->x = 5;
        this->bar = 9;
    }
};

SomeClass.cpp

int Foo::bar = 0;

mainc.pp

#include <iostream>
#include "SomeClass.h"

int main() {
    Foo f;
    f.someFunc();

    std::cout << "f.x = " << f.x << '\n';
    std::cout << "f.bar = " << f.bar << '\n';
    return 0;
}

Compilar y construir con Visual Studio 2017 CE.

Salida

f.x = 5
f.bar = 9

Sin embargo, según cpreference: estático

Los miembros estáticos de una clase no están asociados con los objetos de la clase: son variables independientes con estática o hilo (desde C ++ 11) Duración del almacenamiento o funciones regulares.

Ahora, en cuanto a las funciones de los miembros estáticos que indican:

Las funciones de los miembros estáticas no están asociadas con ningún objeto. Cuando se llama, no tienen este puntero.

Solo quiero una claridad en esto: había pensado que tanto los miembros estáticos como los miembros de la función estática no tenían el puntero this asociado a ellos ...

2
Francis Cugler 26 jun. 2019 a las 03:29

1 respuesta

La mejor respuesta

No están asociados con el puntero this en su ejemplo. Más bien, son accesibles a través del puntero this (por la misma razón, f.bar = 10; también habría sido legal).

Esto se cubre explícitamente en el estándar C ++. Consulte la sección "[Class.Static] Miembros estáticos" ( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf ), que dice:

Un miembro estático S de la clase X puede ser reembolsado utilizando la expresión de ID calificada X :: S; No es necesario utilizar la sintaxis de acceso a los miembros de la clase (8.5.1.5) para referirse a un miembro estático. Se puede referirse a un miembro estático utilizando la sintaxis de acceso a los miembros de la clase, en cuyo caso se evalúa la expresión del objeto.

[Ejemplo:

struct process {
  static void reschedule();
};
process& g();

void f() {
  process::reschedule(); // OK: no object necessary
  g().reschedule(); // g() is called
}

- ejemplo final]

7
Barry 26 jun. 2019 a las 01:35