声明静态类变量

Declaring static class variables

本文关键字:类变量 静态类 静态 声明      更新时间:2023-10-16

我有一个静态字符串变量m的类。

class turbo
 {
 public:
 static string m;
 }

如果我不像下面定义的那样声明,我将得到error undefined reference turbo::m

string turbo::m;

为什么要声明两次?我不需要第二次声明非静态变量。逻辑在哪里?

说实话,我第一次看到这个也很惊讶,
但却找到了非常合理的原因。

当成员变量存储在对象分配的空间中时,静态成员不放置在对象内存空间(堆或堆栈)
但是要有一个私人的共享空间。就像函数一样

因此,在类中声明static string m。就像在说:在某个地方有一个共同的定义名称为turbo::m

这是声明和定义之间的区别,非常类似于声明带有前向引用的函数,例如;

int MyFuncion();

,实际上用函数体来定义它,例如

int MyFunction()
{
    return 1;
}

我知道你有一个对象而不是一个函数,但从概念上讲,声明/定义的思想是相同的。

c++禁止在类体中定义非常量静态数据成员("内联定义")。如果您尝试使用显式构造函数,则会变得更加明显:例如,

class turbo
{
public:
    static string m;
    static string s = string("my_str"); // doesn't work
}

因此,当您在类的主体中编写static string m时,它仅仅是一个声明,而不是定义。您必须稍后定义它:

static string turbo::s = string("my_str");

在您的例子中,您只需调用定义中的默认构造函数:

static string turbo::m; // calls the default constructor

(像任何静态变量一样,初始化发生在程序的最开始,在main之前)

注意该定义也必须只出现一次(以避免多次定义),因此它不能出现在头文件中。

在类定义中只声明静态变量

class turbo
 {
 public:
 static string m;
 }

,但它还没有定义。要定义相应的对象,必须写入

string turbo::m;

现在,无论是否创建了类的实例,它都将存在。