C++11 构造函数的改动
一、继承构造函数
继承构造函数的引入原因:如果基类的构造函数很多,那么子类的构造函数想要实现同样多的构造接口,必须一一调用基类的构造函数,有点麻烦。
于是乎: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 构造函数的改动的更多相关文章
- C++11如何减少内存拷贝次数
C++11中出现了很多迷人的特性.例如智能指针实现高效的内存管理,std::bind和std::function函数封装器,以及lambda实现的函数对象语法糖,都是使我着迷的地方. 而C++11最大 ...
- C++经典面试题库 附带参考答案
1. 面向对象的程序设计思想是什么? 答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象. 2. 什么是类? 答:把一些具有共性的对象归类后形成一个集合,也就是所谓的类. 3. ...
- C#基础学习(二)
---恢复内容开始--- 面向对象 (类是不占内存,实例占内存) C#与python不用可以直接从另一个文件直接实例化一个类,不需要导包: ...
- 【转载】C++面试题(1-50)
转自http://www.jobui.com/mianshiti/it/cpp/5017/ 1. 面向对象的程序设计思想是什么? 答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象. ...
- Flutter 2.10 更新详解
Flutter 2.10 版已正式发布!虽然⾃ 上次稳定版本发布 以来还不到两个⽉,即使在这么短的时间内,我们也已处理和关闭了 1843 个 Issue,合并了来⾃全球 155 位贡献者的 1525 ...
- React版本修改内容
React新版本(0.12.2)在2014年12月18日发布,对比了我之前用的v0.11.2版本改动很大,基本的写法被扩展,让我顿时感觉自己又要重新开始.坑啊~ 事已至此,必须重新适应,首先我们来看看 ...
- C++Primer 第七章
//1.定义在类内部的函数是隐式内联的. //2.默认情况下,this指针的类型是指向类类型非常量版本的常量指针.对于类的常量成员函数的声明方法是:将const放置于成员函数的参数列表后,用于修饰th ...
- 使用Maven搭建Struts2+Spring3+Hibernate4的整合开发环境
做了三年多的JavaEE开发了,在平时的JavaEE开发中,为了能够用最快的速度开发项目,一般都会选择使用Struts2,SpringMVC,Spring,Hibernate,MyBatis这些开源框 ...
- Swift开发语法
Swift开发入门 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者 ...
随机推荐
- 无限极分类php实现—查子孙树、家谱树
1.本文更新日期:2018/05/20 , 亲测可用,在原有基础上进行增强和 详细化 . 2.面包屑导航 和 子孙树 效果图如下: 3.代码: <?php // 无限级分类中,查家谱树(面包屑导 ...
- JavaScript原生对象及扩展
来源于 https://segmentfault.com/a/1190000002634958 内置对象与原生对象 内置(Build-in)对象与原生(Naitve)对象的区别在于:前者总是在引擎初始 ...
- 采集并分析Nginx访问日志
日志服务支持通过数据接入向导配置采集Nginx日志,并自动创建索引和Nginx日志仪表盘,帮助您快速采集并分析Nginx日志. 许多个人站长选取了Nginx作为服务器搭建网站,在对网站访问情况进行分析 ...
- (原)torch模型转pytorch模型
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/7839263.html 目前使用的torch模型转pytorch模型的程序为: https://gith ...
- select收数据
之前写的服务器端 表示都无法收到client发的数据,找不到原因,原来是有个socket接收数据缓冲木有设置,现在设置后就可以正常收到数据啦! server端: #include <winsoc ...
- Python学习笔记(六)—— 条件判断
一.语法 if <条件判断1>: <执行1> elif <条件判断2>: <执行2> elif <条件判断3>: <执行3> e ...
- 基于matplotlib的数据可视化 - 三维曲面图gca
1 语法 ax = plt.gca(projection='3d')ax.plot_surface(x,y,z,rstride=行步距,cstride=列步距,cmap=颜色映射) gca(**kwa ...
- itunes Connect 未能创建 App 图标
之前用的是chrome浏览器提交了app和app图标都是没问题的,可今天一直提交一直没成功,也是符合apple要求格式和大小的,郁闷.后来想了想换个浏览器试试,用了mac自带的safari浏览器后居然 ...
- Linux下实现脚本监测特定进程占用内存情况
Linux系统下,我们可以利用以下命令来获取特定进程的运行情况: cat /proc/$PID/status 其中PID是具体的进程号,这个命令打印出/proc/特定进程/status文件的内容,信息 ...
- windows Server 2012安装GUI
1.进入PowerShell 在命令行提示输入符处,直接输入: PowerShell 2.安装GUI 在命令行提示输入符处,直接输入: Install-WindowsFeature Server-Gu ...