Разве статические члены класса не связаны с указателем this? - PullRequest
2 голосов
/ 26 июня 2019

Возьмите этот пример:

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;
}

Скомпилировано и построено с помощью Visual Studio 2017CE.

выход

f.x = 5
f.bar = 9

Однако согласно cppreference: static

Статические члены класса не связаны с объектами класса: они являются независимыми переменными со статической или потоковой (начиная с C ++ 11) продолжительностью хранения или обычными функциями.

Теперь, что касается статических функций-членов, они заявляют:

Статические функции-члены не связаны ни с одним объектом. При вызове у них нет этого указателя.

Мне просто нужна некоторая ясность в этом: я думал, что и у статических членов, и у членов статических функций не было связано с ними указателя this ...

1 Ответ

7 голосов
/ 26 июня 2019

Они не связаны с указателем this в вашем примере.Скорее, они доступны через указатель this (по той же причине, f.bar = 10; также было бы допустимо).

Это явно указано в стандарте C ++.См. Раздел «[class.static] Статические члены» (http://www.open -std.org / jtc1 / sc22 / wg21 / docs /apers / 2017 / n4713.pdf ), в котором говорится:

Статический член класса X можно ссылаться с помощью выражения квалифицированного идентификатора X :: s;нет необходимости использовать синтаксис доступа к членам класса (8.5.1.5) для ссылки на статический член.К статическому члену можно обращаться с использованием синтаксиса доступа к члену класса, в этом случае вычисляется выражение объекта.

[Пример:

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

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

- конец примера]

...