类成员的初始化--成员初始化列表(常量,引用,成员对象)

常量,引用,对象成员的初始化要在成员初始化表中进行,不可以直接=号赋值。

class B{
}

class A{
     public:
              A():number(n),ref(r),b(b1){...}
     private:
       const int number;
       int & ref;
       B b;
    
}
那为什么是常量,引用,对象成员这三者不可以直接初始化,而要放在成员初始化表中呢?

1.对于常量:

    常量是不可以被赋值的,不能在创建对象的时候点取常量成员然后赋值给它.
   A  a;
   a.number=10;  // error;
   更加 不可以直接就在类的定义中赋值
   class A{
     const int number=10;
   } 
   因为每个对象的number可能是不一样的,这样直接赋值的话,就是要求类的所有对象的number都是固定的,这样很明显不合逻辑。
   另外,有些书认为这样是在给常量赋值,所以是不允许的。

2.对于引用:

    引用本质上来讲也是一种常量,那么它也是不可重新指派的,初始化之后就固定不变。

3.对于对象成员:

   对象成员出现在成员初始化表上,实际上 相当于调用该对象所属类的构造函数,b(b1)即是以b1为参数调用B的构造函数。

   如果不这样做的话,要实现初始化似乎只能传递对象参数生成临时对象来实现,这样的话,根本没有起到初始化的作用。
   请看例子:
#include <iostream>

using namespace std;

class StudentID{

    public:
        StudentID(int id){
           value =id
           cout<<"Assigning student id "<<value<<endl;
        }
        ~StudentID(){
           cout<<"Destructing id " << value <<endl;
        }

    protected:
        int value;
}

class Student{
    public:
        Student(char * pName="noName",int ssID=0){
            cout<<"Constructing student "<<pName<<endl;
            strcpy(name,pName);
            name[sizeof(name)-1]='\0';
            StudentID id(ssID);
        }

    protected:
        char name[20];
        StudentID id;
}

int main(){
    Student s("Randy",9818);
}
print:
Assigning student id 0
Constructing student Randy         
Assigning student id 9818  // 当传递9818给StudentID id(ssID)的时候,调用StudentID的构造函数,这样就在Student的构造函数产生了一个局部对象
Destructing id 9818           // 当
Student的构造函数对象结束的时候,该对象就析构了,那么id 9818就没有了,实际上9818没有初始化Randy的id;
Destructing id 0                // Randy的id仍然为0,程序结束的时候析构。


构造对象的顺序--按照成员属性声明的顺序,而不是成员初始化表的顺序。

静态对象之构造一次。

所有全局对象在main()函数之前被构造,且一般按照声明的顺序。
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值