1.简介

委托构造函数(Delegating Constructor)由 C++11 引入,是对 C++ 构造函数的改进,允许构造函数通过初始化列表调用同一个类的其他构造函数,目的是简化构造函数的书写,提高代码的可维护性,避免代码冗余膨胀。

通俗来讲,一个委托构造函数使用它所属的类的其他构造函数执行自己的初始化过程,或者说它把自己的一些(或者全部)职责委托给了其他构造函数。和其他构造函数一样,一个委托构造函数也有一个成员初始化列表和一个函数体,成员初始化列表只能包含一个其它构造函数,不能再包含其它成员变量的初始化,且参数列表必须与构造函数匹配。

首先看一下一个不使用委托构造函数造成代码冗余的例子。

class Foo
{
public:Foo() :type(4), name('x') {initRest();}Foo(int i) : type(i), name('x') {initRest();}Foo(char c) :type(4), name(c) {initRest();}private:void initRest() {/* init othre members */}int type;char name;//...
};

从上面的代码片段可以看出,类Foo的三个构造函数除了参数不同,初始化列表、函数体基本相同,其代码存在着很多重复。在C++11中,我们可以使用委托构造函数来减少代码重复,精简构造函数。

class Foo
{
public:Foo() {initRest(); }Foo(int i) : Foo() {type = i;}Foo(char e) : Foo() {name = e;}
private:void initRest() { /* init othre members */}int type{1};char name{'a'};
};

一个委托构造函数想要委托另一个构造函数,那么被委托的构造函数应该包含较大数量的参数,初始化较多的成员变量。而且在委托其他构造函数后,不能再进行成员列表初始化,而只能在函数体内对其他成员变量进行赋值。

2.注意事项

(1)不要形成委托环。
在构造函数较多的时候,我们可能拥有多个委托构造函数,而一些目标构造函数很可能也是委托构造函数,这样依赖,我们就可能在委托构造函数中形成链状的委托构造关系,形成委托坏(Delegation Cycle)。

class Foo
{
public:Foo(int i) : Foo('c') { type = i; }Foo(char c) : Foo(1) { name = c; }
private:int type;char name;
};

其中 Foo(int i) 与 Foo(char c) 相互委托就形成了委托坏,这样会导致编译错误。

(2)如果在委托构造函数中使用 try,可以捕获目标构造函数中抛出的异常。

#include <iostream>
using namespace std;class Foo
{
public:Foo(int i) try: Foo(i,'c') {cout<<"start assignment"<<endl;type = i; }catch(...){cout<<"caugth exception"<<endl;}private:Foo(int i,char c) {cout<<"throw exception"<<endl;throw 0;}int type;char name;};int main()
{Foo f(1);return 0;
}

程序输出结果:

throw exception
caugth exception

可见在目表构造函数 Foo(int i,char c) 中抛出异常,在委托构造函数Foo(int i) 中可以进行捕获,并且目标构造函数体内的代码并不会被执行。这样的设计是合理的,因为目标构造函数抛出异常说明对象并没有完成初始化,在委托构造函数中进行赋值操作都是一些无意义的动作。


参考文献

[1] Stanley B. Lippman等著,王刚,杨巨峰译.C++ Primer 中文第5版[M].北京:电子工业出版社,2013-09-01
[2] Michael Wong, IBM XL编译器中国开发团队.深入理解C++11[M].北京:机械工业出版社,2013-06-01
[3] 关于使用C++11中委托构造函数

C++11 委托构造函数相关推荐

  1. [C++11]委托构造函数

    委托构造函数允许使用同一个类中的一个构造函数调用其他的构造函数,从而简化相关变量的初始化. 注意点: 1.这种链式的构造函数调用不能形成一个闭环(死循环),否则会在运行期抛异常. 2.如果要进行多层构 ...

  2. C++11:委托构造函数

    前言 如果一个类中重载了多个构造函数,并且在每个构造函数中都需要对某些变量进行初始化,这时候就会出现很多重复的代码,在C++11之前存在这个问题.而C++11中新增的委托构造函数,就是为了解决这个问题 ...

  3. 委托构造函数继承构造函数

    委托构造函数 委托构造函数的引入 小明和李华给外国友人写信从高中写到了考研写累了,突然想唱歌,为了方便这哥俩唱歌,咱写了个唱歌类给他们.这哥俩唱的不好,就限制他俩只能唱三句.因为有1~3句的选择,就写 ...

  4. C++进阶教程 - 委托构造函数和继承构造函数

    委托构造函数 什么是委托构造函数? 委托构造函数是由C++11引入的新概念,是对C++构造函数的改进,允许构造函数使用初始化列表调用同类中的其他构造函数,旨在简化构造函数的书写,提升代码的可维护性,降 ...

  5. C++构造函数之委托构造函数

    今天在读<C++Primer>时读到委托构造函数一节,书中关于委托构造函数是这样描述的: 一个委托构造函数使用它所属的类的其他构造函数执行自己的初始化过程,或者说它把自己的一些(或者全部) ...

  6. [C++11]继承构造函数

    C++11中提供的继承构造函数可以让派生类直接使用基类的构造函数,而无需自己再写构造函数,尤其是在基类有很多构造函数的情况下,可以极大地简化派生类构造函数的编写. 先来看没有继承构造函数之前的处理方式 ...

  7. C++11 继承构造函数

    1.简介 子类为完成基类初始化,在 C++11 之前,需要在初始化列表调用基类的构造函数,从而完成构造函数的传递.如果基类拥有多个构造函数,那么子类也需要实现多个与基类构造函数对应的构造函数. cla ...

  8. C++11 委派构造函数

    一 委派构造函数 <深入理解C++11> 委派构造:就是指委派函数将构造的任务派给了目标构造函数来完成这样一种类构造的方式. C++11中的委派构造函数是在构造函数的初始化列表位置进行构造 ...

  9. C++11移动构造函数详解

    这里写目录标题 拷贝构造函数 修改后的拷贝构造函数 移动构造函数 移动构造函数的优点 当类中同时包含拷贝构造函数和移动构造函数时,如果使用临时对象初始化当前类的对象,编译器会优先调用移动构造函数来完成 ...

最新文章

  1. Windows批量添加防火墙例外端口
  2. 颠覆传统4S店,特斯拉发布智能售后服务体系
  3. Python编程 高阶函数使用技巧
  4. MySQL子查询介绍
  5. 职场中神奇的程序员,却常常被人说“太直”,这是什么样的思维?
  6. 微课|玩转Python轻松过二级(1.3节):编码规范与代码优化建议1
  7. CentOS4.4平台下安装EXTMAIL手记V1.3
  8. Electron使用时拦截HTTP请求的解决方案
  9. c#操作Xml(五)
  10. linux 系统中编译exe文件,在linux系统下执行C#编译的exe文件
  11. Latex学习笔记 (8) 字体样式之衬线字体与无衬线体字体
  12. 软件配置管理计划示例
  13. 计算机主机是啥意思,服务器宕机是什么意思?电脑宕机的读法与含义
  14. 黑科技智能家电新生儿“智能冰箱”
  15. 升级openssh后出现问题(kex_exchange_identification: client sent。。。。。)
  16. python猴子分桃_猴子分桃 - Ryan in C++ - 博客园
  17. 【02月06日】北上资金近1天流入排行榜
  18. 为什么选择MYSQL
  19. PS(2018)更换启动界面
  20. Python函数:np.sum()以及axis=0、axis=1用法

热门文章

  1. 相机获取的照片向左自动旋转90度解决方法
  2. U盘启动盘恢复为普通盘
  3. iframe页面里的链接在ios设备无法点击的解决办法
  4. 如何解决Greenplum中无法通过标准命令修复的元数据错误
  5. 企鹅手机即将发布,TencentOS会是亮点么?
  6. UESTC 1706 Orbital
  7. java开发实战经典学习笔记第2部分
  8. 手把手教你玩转网络编程模型之完成例程(Completion Routine)篇(上)-转
  9. 蓝桥杯 ALGO-42 算法训练 送分啦
  10. 蓝桥杯 ALGO-83 算法训练 阶乘 java版