非静态成员函数是否可以访问静态成员函数或数据

Can non-static member function access static member function or data?

本文关键字:静态成员 函数 数据 访问 是否      更新时间:2023-10-16

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

#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;
}

代码生成链接器错误!

Undefined symbols for architecture x86_64:
  "test::a", referenced from:
      test::printa() in main.o

在类内将变量声明为static只是一种声明。

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

int test::a = 0;

更准确地说:编译单元基本上是一个.cpp文件。您应该而不是将该行直接放在头文件中,否则您将得到相反的错误:"多重定义…"。

正如您所猜测的,一旦程序启动,这也会将变量初始化为0

如果您将这一行放在类声明下,它将解决您的问题(在这种特定情况下:记住不要将其写在头文件中(。

这是因为您只声明了test::a,而没有定义它:

#include <iostream>
class test
{
    ...
};
int test::a = 1; //Needs a definition!

您只声明了static数据成员。你还没有定义它。

你需要做一些类似int test:: a;的事情来定义它。

也看到这个

允许非静态成员访问静态数据成员。不允许反向,因为静态成员不属于任何对象

您必须定义静态数据成员实例。添加一行。。。

int test::a;

高于main()或低于main()。。。基本上是与class test直接在同一命名空间范围内并且在class test的定义之后的任何地方。