为什么static数据成员一定要在类外初始化?
1.避免重复定义和初始化
<<c++ primer>>说在类外定义和初始化是保证static成员变量只被定义一次的好方法。
但,为什么static const int就可以在类里面初始化呢?
想起C中一个函数里定义一个static变量是为了保证只初始化一次。
那么,是否可以这样理解:
static数据成员在类外定义和初始化是为了保证只被定义和初始化一次,这样编译器就不必考虑类的函数里面第一个对static变量的’=’操作是赋值还是初始化了。
static const int可以在类里面初始化,是因为它既然是const的,那程序就不会再去试图初始化了。
而且,<<c++ primer>>说static const int也必须在类外定义,类里面的只是声明和初始化(但是linux下用GCC试的结果是:不用在类外定义也完全可以,gcc version 3.4.6)。
2.满足C++的static语意
这里的语意,应该就是1中说的意思了吧
只有const没有static的话,类的每个object都有这个const变量,也不能在类的数据成员声明的时候一起初始化了,只能在构造函数的初始化列表里初始化。
//下面是网上看到的内容:
+++++++++++++++++++++++++
#include <iostream.h>
class CDummy
{
public:
static int n; //这里只是声明
};
int CDummy::n=9; //这里是定义加初始化
void main()
{
cout < <CDummy::n < <endl;
}
上面这样完全没问题,但是不能直接在类中初始化,比如:
static int n=9;
+++++++++++++++++++
为什么static成员一定要在类外初始化?
这是因为被static声明的类静态数据成员,其实体远在main()函数开始之前就已经在全局数据段中诞生了(见《Inside The C++ Object Model》page247)!其生命期和类对象是异步的,(而且静态语意说明即使没有类实体的存在,其静态数据成员的实体也是存的)这个时候对象的生命期还没有开始,如果你要到类中去初始化类静态数据成员,让静态数据成员的初始化依赖于类的实体,,那怎么满足前述静态语意呢?难道类永远不被实例化,我们就永远不能访问到被初始化的静态数据成员吗?
所以我的朋友,为了满足C++的static语意,static成员一定要在类外初始化!
分享到:
相关推荐
在学习 static 成员初始化时,我们发现了网上有很多关于 static const 成员的初始化资料。const 成员要在构造函数初始化,而 static 成员在需要在类体外初始化,那么 static const 和 const static 成员应该在哪里...
总结来说,C++中的类成员和数据成员初始化是一个严谨的过程,需要理解构造函数的机制,以及`const`、`static`和数组的特殊性。正确初始化成员可以确保对象的有效性和代码的健壮性。遵循这些规则,可以帮助我们编写出...
在上面的代码中,我们使用初始化列表来初始化数据成员a和b。 static 成员变量 static 成员变量是属于类的,而不是属于对象的。它们可以被所有对象共享。static 成员变量可以在类内部声明,在类外部定义。 在代码...
1. **静态成员变量(Static Fields)**:在类加载时初始化。 2. **实例成员变量(Instance Fields)**:在对象创建时默认初始化或显式初始化。 3. **静态初始化块(Static Initialization Blocks)**:在类加载时...
在易语言中,静态数据成员不能在类的实例化过程中直接初始化,而需要在类的代码段中使用`初始化`过程来设置初始值: ```易语言 .初始化 静态计数 = 0 // 初始化静态计数为0 ``` 访问静态数据成员时,不需要通过类...
在编程中,静态数据成员和静态成员函数是类的一个重要特性,它们与普通的成员变量和成员函数有所不同。静态数据成员属于类,而不是类的每个实例,这意味着所有类的实例共享同一份静态数据成员的副本。这使得静态数据...
Java 数组初始化是 Java 编程语言中的一种基本概念,它允许开发者创建和初始化数组,以便于存储和操作数据。在本文中,我们将对 Java 数组初始化进行详细的介绍,包括一维数组和二维数组的声明、初始化和使用。 一...
易语言中,静态数据成员的初始化通常在类的初始化代码块中进行。由于静态数据成员不是每个对象都有独立的副本,所以初始化只执行一次。例如: ```易语言 类 定义 名为 MyClass 静态 整数 变量 名为 staticValue ...
总之,C++类的静态成员初始化需要根据其类型和const属性来确定初始化的位置。整型和枚举型const静态成员可以直接在类声明中初始化,而其他类型的静态成员则需要在类声明之外初始化,并使用作用域解析运算符指定所属...
在描述中提到的问题,当尝试在头文件(例如`.h`或`.hpp`)中初始化静态数据成员时,如果该头文件被多个源文件(`.cpp`)包含,编译器会为每个包含它的文件分别创建一个静态成员的副本,从而导致“obj重复定义”的...
这种特性使得`static`成员变量在处理那些与类整体相关而非特定对象相关的数据时非常有用。例如,在上面的`SavingAccount`类中,`m_rate`表示的是银行的统一利率,不需要为每个账户对象单独存储,因此适合声明为`...
- 静态数据成员需要在类外进行初始化,如:`int point::count = 0;`。 - 访问静态数据成员时,可以使用作用域解析运算符`::`(例如,`point::count`),也可以通过类的对象访问(例如,`p1.count`,但需要先声明`...
这是由于结构是值类型,其成员未初始化意味着它们可能包含垃圾数据,调用方法可能会产生不可预期的结果。 接下来,我们讨论完全初始化,即确保结构的所有字段都被赋值。这可以通过直接为每个字段赋值或通过构造函数...
在Java编程语言中,`static`关键字扮演着重要的角色,特别是在初始化类的静态成员时。`static`静态初始化块是用来初始化类级别的变量,也就是说,这些变量是属于类本身,而不是类的实例。当我们讨论“Java static...
值得注意的是,如果类的成员变量在类定义时没有初始化,或者使用了用户定义的默认值,那么在构造函数的成员初始化列表中必须显式提供这些成员的初始值。如果忽略了一个成员的初始化,编译器会报错,因为这是强制性的...
在C++编程语言中,类的静态数据成员是一种特殊的数据成员,它不为每个类的实例单独分配存储空间,而是所有实例共享同一份存储。这种特性使得静态数据成员非常适合用来统计类的对象实例数量,因为无论通过类本身还是...
- 在类的静态成员初始化完成之后,才会执行类的非静态成员初始化。 - 最后执行类的构造函数来创建对象。 3. **静态与非静态初始化的区别**: - 静态初始化发生在类被加载时,而非静态初始化则发生在每个对象被...