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

时间:2019-06-26 00:29:45

标签: c++ this c++17 static-members this-pointer

以这个例子为例:

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 个答案:

答案 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
}
     

—结束示例]