请问在构造函数中使用初始化清单和直接在构造函数内初始化成员变量有什么区别?
比如:
construct_function():var1(1),var2(2),var(3)
{}
和
construct_function()
{
var1 = 1;
var2 = 2;
var3 = 3;
}
有没有什么本质区别?
=============================================================================== =======
construct_function():var1(1),var2(2),var(3)
{}
初始化
construct_function()
{
var1 = 1;
var2 = 2;
var3 = 3;
}赋值
首先把数据成员按类型分类
1、内置数据类型,复合类型(指针,引用)
2、用户定义类型(类类型)
分情况说明:
对于类型1,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的。
要是const类型的话只能使用初始化列表。
对于类型2,结果上相同,但是性能上存在很大的差别。
因为类类型的数据成员对象在进入函数体是已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,这是调用一个构造函数,在进入函数体之后,进行的是对已经构造好的类对象赋值,又调用其拷贝赋值操作符才能完成(如果并未提供,则使用编译器提供的默认按成员赋值行为)。
举个例说明
class A;
class B
{
public:
B(){a = 3;}
private:
A a;
}
class A
{
public:
A(){}
A(int){value = 3;}
int value;
}
像上面,我们使a对象的value为3,调用一个A的构造函数+一个默认拷贝赋值符,才达到目的。
B::B():a(3){}
像这样,只调用了一个构造函数就得到了所需的对象啦,所以性能好。
注意:对于const成员,无缺省构造函数的类对象成员,均需放在成员初始化列表。
再举个例子:
class A
{
public:
A(int i){}
};
class B
{
public:
B() : ci(3), a(3){}
private:
const int ci;
A a;
};
int main()
{
B b;
return 0;
}
对于const成员,无缺省构造函数的类对象成员,均需放在成员初始化列表。