类成员变量初始化位置

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. 代码 

#include<iostream>
using namespace std;

class Test {
  
int a;              // 初始化位置:构造函数初始化成员列表,构造函数,其他函数
  const int b;        // 初始化位置:构造函数初始化成员列表
  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,就是静态的,就只能有一份,只能在类文件中初始化。

posted @ 2011-08-10 07:56  xiaodongrush  阅读(1859)  评论(0编辑  收藏  举报