类成员变量初始化位置

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.youkuaiyun.com/yjkwf/article/details/6067267

5. 备注

    参考的文章中提到static const int也可以在构造函数中初始化,这一点我验证过了,在构造函数成员初始化列表中,和构造函数中都是不行的,分别编译报错:“静态变量只能在其定义处被初始化”,“对只读变量赋值”。总之,只要有static,就是静态的,就只能有一份,只能在类文件中初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值