
----你坚持下来了,而别人坚持不下来,这就是你的资本。
《C++Primer》一书中关于委托构造函数是这样描述的:
一个委托构造函数使用它所属的类的其他构造函数执行自己的初始化过程,或者说它把自己的一些(或者全部)职责委托给了其他构造函数。和其他构造函数一样,一个委托构造函数也有一个成员初始值的列表和一个函数体。在委托构造函数内,成员的初始值列表只有一个唯一的入口,就是类名本身。和其他成员初始值一样,类名后面紧跟圆括号括起来的参数列表,参数列表必须与类中另外一个构造函数匹配。
概念比较难懂,下面举个小例子:
class Base {public:int value1;int value2;Base() {value1 = 1;}Base(int value) : Base() { // 委托Base() 构造函数value2 = value;}};
why?
在C++98中,如果你想让两个构造函数完成相似的事情,可以写两个大段代码相同的构造函数,或者是另外定义一个init()函数,让两个构造函数都调用这个init()函数。例如:
class X {int a;// 实现一个初始化函数init(int x) {if (0<x && x<=max) a=x; else throw bad_X(x);}public:// 三个构造函数都调用validate(),完成初始化工作X(int x) { init(x); }X() { init(42); }};
这样的实现方式重复罗嗦,并且容易出错。并且,这两种方式的可维护性都很差。所以,在C++0x中,我们可以在定义一个构造函数时调用另外一个构造函数:
class X {int a;public:X(int x) { if (0<x && x<=max) a=x; else throw bad_X(x); }// 构造函数X()调用构造函数X(int x)X() :X{42} { }};
总结
一个构造函数想要委托另一个构造函数,那么被委托的构造函数应该包含较大数量的参数,初始化较多的成员变量。而且在委托其他构造函数后,不能再进行成员列表初始化,而只能在函数体内进行初始化其他成员变量。
关注公众号获取更多信息:

本文介绍了C++中委托构造函数的概念及其实现方式。通过具体示例对比了C++98与C++0x中构造函数的不同实现方法,解释了如何通过一个构造函数调用另一个构造函数来减少代码重复,提高可维护性。
343

被折叠的 条评论
为什么被折叠?



