类成员变量初始化位置
1. 简述
类的成员变量多种多样,比如:int a, const int a, int &a, static int a, static const int a, statice int& a。前面三个分别是普通变量、const变量和引用变量,后面的三个是前面三个分别加上了static。本文主要分析这六种变量初始化的位置。
2. 说明
对于int、const int和int&,这三个类型相对于static来说,每个对象都有一份,因此每个对象都要构造一次。其中,int的初始化不受限制,哪里都行。const int和int &要求在定义的时候初始化,因此,默认要求只能在初始化成员列表中进行。static int、static const int和static int&这三个类型,只要是加上了static,就是静态的,那么对于类来说就是唯一的,所有对象共用一个,那么就应该在在类文件中初始化,在其他任何地方初始化都不合适。有人可能会想,static const int,也是const能不能在初始化成员列表中初始化呢?不行,如果在初始化成员列表中初始化,那么每调用一次构造函数,就会重新初始化一次这个类型,而这个类型是static,不应该重复初始化,编译不过的,假设编译过了,那么这个类型也会多次被初始化,与const相悖。
3. 代码
using namespace std;
class Test {
int a; // 初始化位置:构造函数初始化成员列表,构造函数,其他函数
int & c; // 初始化位置:构造函数初始化成员列表
static int d; // 初始化位置:类文件
static const int e; // 初始化位置:类文件
static int &f; // 初始化位置:类文件
public :
Test(int a,int b,int c):a(a),b(b),c(c) { } // 构造函数初始化成员列表
};
int Test::d = 0; // 类文件
const int Test::e = 0; // 类文件
int& Test::f = Test::d; // 类文件
int main() {
Test test(1,2,3);
system("PAUSE");
return 0;
}
4. 参考资料
C++ static、const和static const 以及它们的初始化 http://blog.csdn.net/yjkwf/article/details/6067267
5. 备注
参考的文章中提到static const int也可以在构造函数中初始化,这一点我验证过了,在构造函数成员初始化列表中,和构造函数中都是不行的,分别编译报错:“静态变量只能在其定义处被初始化”,“对只读变量赋值”。总之,只要有static,就是静态的,就只能有一份,只能在类文件中初始化。