代码之家  ›  专栏  ›  技术社区  ›  Francis Cugler

静态类成员和这个指针不相关吗?

  •  1
  • Francis Cugler  · 技术社区  · 6 年前

    举个例子:

    某个类。h

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

    SomeClass.cpp公司

    int Foo::bar = 0;
    

    缅因州

    #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 与它们关联的指针。。。

    0 回复  |  直到 6 年前
        1
  •  7
  •   Barry    6 年前

    它们与 this 你例子中的指针。相反,它们碰巧可以通过 指针(出于同样的原因, f.bar = 10; 也会是合法的)。

    这是在C++标准中明确规定的。参见“[class.static]静态成员”一节( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf ),其中说明:

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

    [示例:

    struct process {
      static void reschedule();
    };
    process& g();
    
    void f() {
      process::reschedule(); // OK: no object necessary
      g().reschedule(); // g() is called
    }
    

    –结束示例]

    推荐文章