一、继承构造函数

继承构造函数的引入原因:如果基类的构造函数很多,那么子类的构造函数想要实现同样多的构造接口,必须一一调用基类的构造函数,有点麻烦。

于是乎:C++11引入继承构造函数,子类可以通过使用using声明来声明继承基类的构造函数。

#include <iostream>
using namespace std; class _A
{
public:
_A(){;}
_A(int _InInt) {;}
_A(double _InDouble, int _InInt) {;}
_A(float _InFloat, int _InInt, const char* _Char) {;}
}; class _B : public _A
{
public:
using _A::_A; // 使用_A中的构造函数
// Somthing...
virtual void _ExtraInterface() {;}
}; int main()
{
_A a;          //正确
_A b();        //正确
_A c(1.0, );      //正确
_A d(1.0, , "hello"); //正确
return ;
}

使用using _A::_A; 把基类中的构造函数都继承到派生类_B中, 这样最开始的那段代码就可以摆脱基类那么多构造函数接口了。

更为精巧的是:C++11标准继承构造函数被设计为跟派生类中的各种类默认函数(默认构造、析构、拷贝等)一样,是隐式的。这意味着如果继承构造函数不被相关代码使用,编译器不会为其产生真正的函数代码,这无疑比透传方案更加节省目标代码空间。

但是:继承构造函数只会初始化基类中的成员变量(毕竟只是从基类继承下来的), 对于派生类中的变量初始化就无能为力。可以配合另一个C++11中的新特性: 数据成员就地初始化,来解决这个问题。但是,这种做法导致子类的成员不能在构造函数的参数列表中体现出来。

使用注意点:

  (1) C++11中的继承构造函数特性最有用的场合就是:派生类只是在基类的基础上添加了几个新的接口, 这个时候继承构造函数最能够展现威力。

  (2) 子类继承了基类的构造函数,那么子类就不会自动生成默认构造函数。

所以,如果子类新增了自己的成员变量,还是乖乖回到以前的初始化列表中去吧。

二、委派构造函数

所谓委派构造,就是指委派函数将构造的任务委派给目标构造函数来完成这样一种类构造的方式。

托构造函数允许类中的一个构造函数通过初始化列表方式来调用同一个类中的另一个构造函数。可以减少冗余代码和重复代码,能提高代码的可读性。

class Info {
public:
Info() : Info(, 'a') { }
Info(int i) : Info(i, 'a') { }
Info(char e): Info(, e) { } private:
Info(int i, char e): type(i), name(e) { /* 其他初始化 */ }
int type;
char name;
// ...
};

在委托构造的链状关系中,有一点必须注意:就是不能形成委托环。如下:

struct Rule2 {
int i, c;
Rule2(): Rule2() {}
Rule2(int i): Rule2('c') {}
Rule2(char c): Rule2() {}
};

Rule2定义中,Rule2()、Rule2(int)和Rule2(char)都依赖于别的构造函数,形成环委托构造关系。这样的代码通常会导致编译错误(gcc好像不会报错)。

 

C++11 构造函数的改动的更多相关文章

  1. C++11如何减少内存拷贝次数

    C++11中出现了很多迷人的特性.例如智能指针实现高效的内存管理,std::bind和std::function函数封装器,以及lambda实现的函数对象语法糖,都是使我着迷的地方. 而C++11最大 ...

  2. C++经典面试题库 附带参考答案

    1.    面向对象的程序设计思想是什么? 答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象. 2.    什么是类? 答:把一些具有共性的对象归类后形成一个集合,也就是所谓的类. 3.  ...

  3. C#基础学习(二)

    ---恢复内容开始--- 面向对象 (类是不占内存,实例占内存) C#与python不用可以直接从另一个文件直接实例化一个类,不需要导包:                                ...

  4. 【转载】C++面试题(1-50)

    转自http://www.jobui.com/mianshiti/it/cpp/5017/ 1.    面向对象的程序设计思想是什么? 答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象. ...

  5. Flutter 2.10 更新详解

    Flutter 2.10 版已正式发布!虽然⾃ 上次稳定版本发布 以来还不到两个⽉,即使在这么短的时间内,我们也已处理和关闭了 1843 个 Issue,合并了来⾃全球 155 位贡献者的 1525 ...

  6. React版本修改内容

    React新版本(0.12.2)在2014年12月18日发布,对比了我之前用的v0.11.2版本改动很大,基本的写法被扩展,让我顿时感觉自己又要重新开始.坑啊~ 事已至此,必须重新适应,首先我们来看看 ...

  7. C++Primer 第七章

    //1.定义在类内部的函数是隐式内联的. //2.默认情况下,this指针的类型是指向类类型非常量版本的常量指针.对于类的常量成员函数的声明方法是:将const放置于成员函数的参数列表后,用于修饰th ...

  8. 使用Maven搭建Struts2+Spring3+Hibernate4的整合开发环境

    做了三年多的JavaEE开发了,在平时的JavaEE开发中,为了能够用最快的速度开发项目,一般都会选择使用Struts2,SpringMVC,Spring,Hibernate,MyBatis这些开源框 ...

  9. Swift开发语法

    Swift开发入门 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者 ...

随机推荐

  1. Openwrt中用iftop查看网络流量情况

    iftop可以查看指定网卡上的流量情况, 命令说明 iftop: display bandwidth usage on an interface by host Synopsis: iftop -h ...

  2. iOS应用之间的跳转

    app应用跳转的原理解析 如何实现两个app应用之间的跳转 如何实现两个app之间跳转到指定界面 二.应用跳转原理 相信从一个应用跳转到另一个应用大家并不陌生,最常见的莫过于第三方登录,支付宝支付等等 ...

  3. scp的两种方式

    如果host A 与 host B建立了信任连接(B有A的public key),那么从A向B传送文件,或者从B上传回文件都可以省略密码.但是前提是命令是在A上执行的. 从A向B拷贝文件 on hos ...

  4. 树莓派进阶之路 (016) - 通过595驱动4位LED显示系统时间

    模块图片,4位共阳极数码管. 我们使用树莓派wiringPi的库来通过74HC595驱动4位数码管: C 代码如下: #include <wiringPi.h> #include < ...

  5. Intel Edison学习笔记(二)—— 入门环境配置

    一.安装Screen sudo apt-get install screen 二.配置 1.连接USB,等待出现 2.测试串口是否存在: ls /dev/ttyUSB0 输出/dev/ttyUSB0, ...

  6. Linux安装ElasticSearch与MongoDB分布式集群环境下数据同步

    ElasticSearch有一个叫做river的插件式模块,可以将外部数据源中的数据导入elasticsearch并在上面建立索引.River在集群上是单例模式的,它被自动分配到一个节点上,当这个节点 ...

  7. VS2017 IDE开发工具选型、安装和使用

    原文地址:https://blog.csdn.net/boonya/article/details/78739500 距离上次使用VS工具已是2年前了,这次准备选择比较新的版本来开发桌面程序了.总的来 ...

  8. 【C语言】字符串常量与指针

  9. Linux系统排查——CPU负载篇

    本随笔介绍CPU负载的排查手段. 查看系统负载的工具:uptime,w,都能查看系统负载,系统平均负载是处于运行或不可打扰状态的进程的平均数, 可运行:运行态,占用CPU,或就绪态,等待CPU调度. ...

  10. span的赋值与取值

      1.<span id="span_id">span的文本</span>的取值. js取<span>的值并不是用document.getEle ...