前言

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

委托构造函数

我们先来看一个老版本的写法示例:

class ClassA{public:ClassA(){}ClassA(int max){m_max = max > 0 ? max : 20;}ClassA(int max,int min){m_max = max > 0 ? max : 20;m_min = min > 0 && min < m_max ? min : 5;}ClassA(int max,int min,int middle){m_max = max > 0 ? max : 20;m_min = min > 0 && min < m_max ? min : 5;m_middle = middle < max && middle > min ? middle : 10;}private:int m_max;int m_min;int m_middle;
};

以上示例只是为了展示在成员变量较多、初始化比较复杂的并且存在多个构造函数的情况下,每个构造函数都需要进行赋值,代码重复繁琐。

通过委托构造函数就可以简化这个过程:

class ClassA{public:ClassA(){}ClassA(int max){m_max = max > 0 ? max : 20;}ClassA(int max,int min):ClassA(max){m_min = min > 0 && min < m_max ? min : 5;}ClassA(int max,int min,int middle):ClassA(max,min){m_middle = middle < max && middle > min ? middle : 10;}private:int m_max;int m_min;int m_middle;
};

需要注意的是,这种链式调用构造函数不能形成一个环,否则将会在运行时抛异常。

注意

注意:使用了委托构造函数后就不能用类成员初始化了。
如下:

class ClassA{public:ClassA(){}ClassA(int max){m_max = max > 0 ? max : 20;}//errorClassA(int max,int min):ClassA(max),m_str("abc"){m_min = min > 0 && min < m_max ? min : 5;}//只能通过成员赋值来初始化ClassA(int max,int min):ClassA(max){m_str = "abc";m_min = min > 0 && min < m_max ? min : 5;}private:int m_max;int m_min;string m_str;
};

以上写法会报错:error: an initializer for a delegating constructor must appear alone。
只能通过成员赋值来进行初始化。

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

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

    1.简介 委托构造函数(Delegating Constructor)由 C++11 引入,是对 C++ 构造函数的改进,允许构造函数通过初始化列表调用同一个类的其他构造函数,目的是简化构造函数的书写 ...

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

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

  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. 纠结的Python2.7编码与os.walk()函数的目录参数
  2. c语言产生cl.exe错误,vc++6.0执行cl.exe时出错
  3. MySQL——外部数据的批量导入
  4. 6面向对象的程序设计
  5. kb4023057安装失败_微软重发Win10 KB4023057 补丁,推动Win10更新
  6. “智慧法院”数据融合分析与集成应用
  7. 使用 nw-builder 构建跨平台桌面应用程序
  8. 树莓派教程 - 1.1 树莓派GPIO库wiringPi 硬件PWM可调频率
  9. Android事件处理
  10. 完美抠图王冰冰!字节实习生实现4K60帧视频实时抠图,连头发丝都根根分明!...
  11. catboost原理
  12. 数据库——sql-server
  13. Intel前CEO欧德宁的“功“与”过”
  14. python爬取凤凰新闻网_python爬取凤凰网站的新闻,及其链接地址,来源,时间和内容,用selenium自动化和requests处理数据...
  15. 聊天机器人:DeepMind的sparrow
  16. Arduino连接pH计
  17. lol美服一直显示链接服务器,LOL美服注册怎么一直显示账号已被使用
  18. 「镁客早报」库克抨击高通,表明不可能在法律纠纷中达成和解;传闻无人驾驶公司Aurora融资20亿美元... 1
  19. PanDownload——卢本伟修订版,复活了!60MB/s!附下载地址
  20. android给EditText加金额的属性,带元,角和分,如¥12.34

热门文章

  1. 超详细!使用OpenCV深度学习模块在图像分类下的应用实践
  2. Springboot端口设置
  3. 通过jS打包下载图片
  4. python数据分析与应用
  5. linux下elasticsearch 安装、配置及示例
  6. .NET 环境中使用RabbitMQ
  7. 捕获分组和非捕获分组以及命名分组
  8. 分分钟一键部署Zabbix Server
  9. swift3.0截取View生成图片 图片截取成新图片
  10. 2016/08/24 CppCon 2015 Bjarne Stroustrup “Writing Good C++14