我有静态字符串变量m
的类。
class turbo
{
public:
static string m;
}
如果我没有声明如下定义,我会得到error undefined reference turbo::m
。
string turbo::m;
为什么我要申报两次?我不需要第二次声明非静态变量。逻辑在哪里?
答案 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;
现在无论是否创建了类的实例,它都将存在。