您的位置:首页 > 编程语言 > C语言/C++

C++ 学习之构造函数:构造函数小结2 构造函数初始化列表

2011-04-12 12:26 357 查看
构造函数初始化列表以一个冒号:开始,接着是一个以逗号分隔的数据成员列表,每个数据成员后面跟着一个圆括号的初始化式。

在日常使用中,构造函数初始化列表可以使用,也可以省略。此时要弄清楚构造函数执行其实是分为两个阶段的:1)初始化阶段;2)普通的计算阶段阶段。

初始化阶段:初始化列表中显示初始化的成员按照列表中圆括号内的值初始化,而对于初始化列表中没有显式列出的成员,若是类成员,则调用该类型的默认构造函数初始化,若是内置类型或者复合类型,则按照变量初始化的原则,在局部作用域中的不做初始化,全局作用于中的初始化为0。

普通的计算阶段:一般是指在构造函数的函数体内对数据成员做赋值工作,千万记住,在函数体内进行赋值操作之前,数据成员的初始化已经完成。

但是有3中情况一定要用到构造函数初始化列表的:类中的数据成员含有1)没有默认构造函数的类类型成员2)const数据成员3)引用成员。

举个例子:



此时,我们编译程序可以看到会报错:



因为该构造函数没有对const和引用数据成员使用构造函数初始化列表进行初始化,后面构造函数体内的赋值就会变成不合法的。

正确的构造函数应该为程序中绿色部分的使用初始化列表的构造函数。

之后我们再次运行程序可以得到想要的结果:



在使用初始化列表时,要注意一个小问题,就是数据成员的初始化问题,我们写初始化列表时一个别较好的习惯是初始化列表中成员初始化的顺序最好按照数据成员在类中定义的顺序。避免一些小麻烦。

如class X{

public:

X(int val):j(val),i(j){}

private:

int i;

int j;

};

编译此程序会出错,原因在于初始化列表初始化数据成员是按照定义的顺序进行的,首先要初始化成员i,而成员i是用j来初始化的,此时j还没有初始化,因此会出错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: