【请教】关于C++构造函数的初始化成员表达式

来源:百度知道 编辑:UC知道 时间:2024/05/24 11:57:35
请问初始化成员表达式和在函数体内赋值表达式有什么区别?
比方说我定义了一个类:
class point
{
public:
point();
point(int a,intb);
private:
int m, n;
};
在实现类成员函数时,
(1). point::point(int a,intb)
{
m=a;
n=b;
}
(2). point::point(int a, int b)
:m(a),n(b)
{
}
(1),(2)有什么区别?(不 是指形式,而是结果的区别)
还有:
初始化成员表达式有没有什么特殊用途(不同于“=”的)?

谢谢大家对一个菜鸟的无私帮助 ~

初始化成员列表一般情况下比赋值效率高,在你这个程序里没表现出来,但如果你用其他类对象来复制构造一个类对象时,如果在复制构造函数体内调用operator = ,那么该对象在进入复制构造函数的大括号之前就已经调用了一次它自己的默认构造函数,然后才又在复制构造函数体内调用其operator = ;如果该对象没有默认的构造函数则你不可以在函数体内使用operator = 来模拟初始化,而必须在初始化成员列表中对其进行初始化。

所以如果不在初始化成员列表中初始化类对象,则初始化一个类对象就需要调用一次构造和一次operator = ,而在初始化成员列表中初始化则只调用一次复制构造;

对于内置类型来说使用operator = 和使用初始化成员列表没有大的区别,但为了保持一致性,最好也使用初始化成员列表,而且在某些情况下非使用列表,比如类中有引用或者const量,则只能在初始化成员列表中对其进行初始化。

详情请见:

《Effective C++》

Item 4: Make sure that objects are initialized before they're used