静态类成员与this指针没有关联吗?

Fra*_*ler 2 c++ this static-members this-pointer c++17

举个例子:

SomeClass.h

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

SomeClass.cpp

int Foo::bar = 0;
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

使用Visual Studio 2017CE编译和构建。

输出量

f.x = 5
f.bar = 9
Run Code Online (Sandbox Code Playgroud)

但是根据cppreference:static

类的静态成员不与该类的对象关联:它们是具有静态或线程(自C ++ 11起)存储持续时间或常规函数的自变量。

现在,对于静态成员函数,它们声明:

静态成员函数不与任何对象关联。调用时,它们没有此指针。

我只想对此有所澄清:我以为静态成员和静态函数成员都没有this与之关联的指针...

小智 7

它们与this您的示例中的指针无关。相反,它们恰好可以通过this指针访问(出于同样的原因,f.bar = 10;也将是合法的)。

C ++标准中明确涵盖了这一点。请参阅“ [class.static]静态成员”部分(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf),其中指出:

可以使用限定ID表达式X :: s来引用类X的静态成员;不必使用类成员访问语法(8.5.1.5)来引用静态成员。可以使用类成员访问语法来引用静态成员,在这种情况下,将评估对象表达式。

[示例:

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

void f() {
  process::reschedule(); // OK: no object necessary
  g().reschedule(); // g() is called
}
Run Code Online (Sandbox Code Playgroud)

—结束示例]