以这个例子为例:
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
类的静态成员与该类的对象无关:它们是具有静态或线程(自C ++ 11起)存储持续时间或常规函数的自变量。
现在它们声明的静态成员函数为:
静态成员函数未与任何对象关联。调用时,它们没有此指针。
我只是想澄清一点:我以为静态成员和静态函数成员都没有与之关联的this
指针...
答案 0 :(得分: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 }
—结束示例]