您的位置:首页 > 其它

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

2012-07-21 03:45 330 查看
常量,引用,对象成员的初始化要在成员初始化表中进行,不可以直接=号赋值。

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()函数之前被构造,且一般按照声明的顺序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐