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

来源:互联网 发布:淘宝刷粉丝刷收藏软件 编辑:程序博客网 时间:2024/05/17 01:00
常量,引用,对象成员的初始化要在成员初始化表中进行,不可以直接=号赋值。

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()函数之前被构造,且一般按照声明的顺序。