常量,引用,对象成员的初始化要在成员初始化表中进行,不可以直接=号赋值。
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()函数之前被构造,且一般按照声明的顺序。