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)
类的静态成员不与该类的对象关联:它们是具有静态或线程(自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)来引用静态成员。可以使用类成员访问语法来引用静态成员,在这种情况下,将评估对象表达式。
[示例:
Run Code Online (Sandbox Code Playgroud)struct process { static void reschedule(); }; process& g(); void f() { process::reschedule(); // OK: no object necessary g().reschedule(); // g() is called }—结束示例]