构造函数初始值列表

来源:互联网 发布:linux中录入历史字符 编辑:程序博客网 时间:2024/06/05 02:36

在 C++编程的过程中,我们对构造函数通常有以下两种写法:
zhangteng::zhangteng(int a,int b):age(a),score(b){}
zhangteng::zhangteng(int a,int b)
{
private:
age=a;
score=b;
}
前者被称为初始值列表法,后者则是初始化与赋值分开。
在程序的编写过程中,最好养成使用初始值列表的习惯。原因有两个:
1.底层效率问题:前者效率优于后者
2.一些数据成员(例如常量对象、引用、某种未提供默认构造函数的类类型)必须使用初始化列表的方法,使用赋值的方法会出现问题。
zhangteng::zhangteng(int a,int b)
{
age=a;
score=b;
}
private:
const int age;
int & score;
上述写法是不对的。
因为如果没有构造函数的初始值列表显示的初始化成员,则该成员将在构造函数体之前执行默认初始化。
也即在执行age=a;score=b;之前系统已经默认对age和score执行了默认赋值。而age是定义为常int型变量,我们不能对其进行二次赋值,这是显而易见的。而score作为引用变量,也是不能进行二次赋值的。具体原因我们举个例子来说明:
int a=6,b=9;
int &c=a;
c=b;
这三条语句在语法上是没有问题的,但分析一下其结果,a和b和c的值都会变为9,而c仍然是a的引用而不是b.也就是说引用二次赋值,在语法上是没有问题的,但往往在逻辑功能上已经背离了程序设计的初衷。
所以我们要杜绝这种做法。
成员的初始化顺序与他们在类定义中出现的顺序一致,构造函数初始值列表的前后位置关系不会影响实际的初始化顺序。

1 0
原创粉丝点击