声明静态类变量

时间:2014-08-23 19:27:50

标签: c++

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

class turbo
 {
 public:
 static string m;
 }

如果我没有声明如下定义,我会得到error undefined reference turbo::m

string turbo::m;

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

4 个答案:

答案 0 :(得分:4)

说实话,我第一次也对此感到惊讶,
但找到了合理的理由。

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

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

希望这可以解决问题。

答案 1 :(得分:1)

声明和定义之间的区别,非常类似于使用前向引用声明一个函数,例如;

int MyFuncion();

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

int MyFunction()
{
    return 1;
}

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

答案 2 :(得分:1)

C ++禁止在类的主体中定义非const静态数据成员(“内联定义”)。如果您尝试使用显式构造函数,则会更加明显:例如,

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之前。)

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

答案 3 :(得分:0)

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

class turbo
 {
 public:
 static string m;
 }

但尚未定义。要定义必须编写的相应对象

string turbo::m;

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