非静态成员函数可以访问静态成员函数还是数据?

use*_*693 4 c++ static class

我搜索了互联网,发现有人说非静态成员函数可以访问静态成员函数或数据.然后我写了一个程序来验证它.

#include <iostream>
class test
{
public:
    static int a;
    void printa()
    {
        std::cout<<a;
    }
};

int main(int argc, const char * argv[])
{
    test m;
    m.printa();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

代码生成链接器错误!

Undefined symbols for architecture x86_64:
  "test::a", referenced from:
      test::printa() in main.o
Run Code Online (Sandbox Code Playgroud)

Nbr*_*r44 8

将变量声明为static类内部只是一个声明.

您还需要定义变量,这意味着在单个编译单元中添加此行:

int test::a = 0;

更确切地说:编译单元基本上是.cpp文件.你应该不是直接把该行的头文件,否则你会得到相反的错误:"多重定义...".

正如您所猜测的那样,这也将0在您的程序启动后初始化您的变量.

如果你把这一行放在你的类声明之下,它将解决你的问题(在这种特定的情况下:记住不要在头文件中写这个).

  • 值得添加"不要把它放在头文件中",因为不是每个人都知道"编译单元"是什么意思. (2认同)