C++中类的静态变量初始化,为什么包括数据类型
Static Variable initialisation for Classes in C++, why include data type?
我一直在学习C++,我遇到了静态变量(我有C89的先验知识),在我使用的资源中,他们在类中声明了一个静态变量,例如:
class nameHere
{
public:
static int totalNum;
}
int nameHere::totalNum = 0;
int main()
{}
例如。我不明白的是,既然我已经在类定义中声明了静态变量是整数,为什么我还需要在类定义之外将其声明为整数?这样简单地初始化它是否没有意义:
nameHere::totalNum = 0;
int main()
{}
C++有什么特殊的原因或者仅仅是一个约定吗?谢谢你的帮助!
这(可能)会使语言更难解析(而且解析起来已经非常困难了)。
实际上,数据类型(int
、long
、my_class
,等等)告诉编译器它所看到的是一个声明的开始(在本例中,这也是一个定义)。如果没有这一点,编译器将很难对事物进行排序。
在全局范围的特定情况下,情况不会那么糟糕,因为在全局范围内,你所能拥有的只是一系列声明。然而,在任何其他范围内,事情都会更加困难(在全球范围内制定一条规则,在其他地方制定另一条规则确实会很糟糕)。
在C++11中,您可以简单地初始化类内的变量:
class nameHere
{
public:
static const int totalNum = {0};
}
定义和声明之间有区别。虽然类中的静态变量已经声明,但尚未定义。一个定义规则,解释声明和定义,并说明
在任何翻译单元中,模板、类型、函数或对象只能有一个定义。其中一些可以有任意数量的声明。
因此,在声明变量时必须使用对象的完整类型。
相关文章:
- 为什么 cmake 许可证<>样式不包括?
- 为什么数组的 GCC 聚合初始化首先用零填充整个事物,包括非零元素?
- 为什么GSL-Lite试图包括<array>?
- 为什么不是条件 *First1 == * First2 ??(C++ STL 包括函数实现)
- 为什么 FFMPEG 适用于 1080p 但不适用于 720p 尺寸......(包括代码)
- 为什么建议包括Googletest源文件
- 为什么在对自定义对象的向量进行分类时,我们将在struct的定义中包括比较函数
- 为什么包括-FPIC来编译静态库会在运行时会导致分割故障
- 为什么指定这些C++标头包括 <initializer_list>?
- 当我尝试在M和N之间生成所有质数时,为什么会遇到运行时错误(M和N(包括M和N)
- 为什么C 标准仍然不包括文件系统和网络
- C++链接器错误 - 看不到为什么它没有链接?(包括完整的代码示例)
- 为什么包括警卫对我没有影响?我是不是错过了什么
- C++中类的静态变量初始化,为什么包括数据类型
- 为什么<initializer_list>使用自动必须包括在内?
- 为什么额外的-I标志(包括目录)会中断编译?(使用英特尔编译器)
- 为什么我的类是不可访问的,而我已经包括了头文件
- 为什么switch总是运行default?(与休息;包括)
- 为什么我不需要包括main.cpp
- 为什么包括原子-给出错误