C++类中成员变量的初始化有两种方式:
构造函数初始化列表和构造函数体内赋值。
初始化列表对成员变量做的事情叫做初始化,而构造函数体内对成员变量做的事情就叫做赋值了。
整个构造函数的执行过程包括(初始化列表以及构造函数体内)都属于该对象初始化的过程
初始化早于赋值,它是随着对象的诞生一起进行的。而赋值是在对象诞生以后又给予它一个新的值。
c++在哪些情况下只能使用初始化列表而不能用赋值
1-如果类存在继承关系,派生类必须在其初始化列表中调用基类的构造函数)
2-需要初始化const修饰的类成员
3-需要初始化引用成员数据
4.类成员为没有默认构造函数的类类型??
因为:常量不能被赋值,只能被初始化,所以必须在初始化列表中完成,C++引用也一定要初始化,所以必须在初始化列表中完成。
class CTestBase
{
public:
CTestBase(int a) : val(a) {}
private:
int val;
};
class CTestconst {
public:
CTestconst(int a, int c, int *pd);
virtual ~CTestconst() {}
int m_a;
const int m_c;
const int *m_pd;
};
class CTestconstson :public CTestconst {
public:
CTestconstson(int a,int b, int c, int *pd);
virtual ~CTestconstson() {}
int m_b;
CTestBase base;
};
CTestconst::CTestconst(int a, int c, int *pd):
m_a(a),m_c(c),m_pd(pd)
{
}
CTestconstson::CTestconstson(int a, int b, int c, int *pd):
CTestconst(a,c,pd),m_b(b), base(a)
{
}
调用:
int pdson = 2;
CTestconstson(1, 1, 1, &pdson);
明显构造函数初始化列表的方式得到更高的效率。
|