静态类的元素与this指针没有关联吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (29)

举个例子:

SomeClass.h

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

SomeClass.cpp

int Foo::bar = 0;

Matrchkpp

#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:静态

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

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

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

我只想要清楚一点:我曾经认为静态成员和静态函数成员都没有this与它们关联的指针......

提问于
用户回答回答于

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

这在C ++标准中明确涵盖。见“12.2.3静态成员”(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf),其中规定:

可以使用qualified-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
}

- 结束例子]

扫码关注云+社区

领取腾讯云代金券