声明静态类变量
Declaring static class variables
我有一个静态字符串变量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;
现在,无论是否创建了类的实例,它都将存在。
相关文章:
- 类和静态变量
- (为什么)我们可以在初始化中将非静态类成员分配给静态变量吗?
- 在 c++ 中使用字符串变量选择静态类结构,而不带对象
- 从静态成员函数访问私有非静态类变量 - C++
- 静态类变量的多重定义
- C++ 在静态函数中使用非静态变量返回类实例
- 模板类中嵌套类的C 静态成员变量
- 重新声明的静态类变量
- 尝试为所有子类 B 编辑父类 A 类的静态变量
- 如何创建一个静态类来引用带有C++的字符串变量
- 类的静态成员变量(受保护)的作用域
- C++ - 在派生类中静态初始化受基类保护的成员变量
- 我如何防止静态类成员变量需要两个定义/声明
- 模板类的嵌套类,模板类的静态成员变量
- 我应该更喜欢在类方法中使用静态类变量还是静态变量
- 每个派生类的静态变量
- C++中线程计数的静态类变量
- 函数内部的静态变量与c++中的静态类变量
- 是否可以在没有模板参数的情况下使用模板化类的静态类函数
- "类变量"、"类变量()"和"类变量(参数)"之间的区别