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 月,苹果开发者 ...
随机推荐
- 图标资源: http://www.easyicon.net/ 可以按关键词搜索
搜索图标
- Oracle自学笔记(一)
1.创建用户并指定表空间 create user gy_3004 identified by gy_3004 default tablespace gy_3004_data temporary tab ...
- glog的使用
主要还是看官方文档吧 win32下,把#define GLOG_NO_ABBREVIATED_SEVERITIES 放到#include <windows.h>之前,具体说明文档中有说. ...
- 如何使用Git上传项目代码到github
这是我第一次应用git,以下仅供git的初学者参考. github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开.这对于一般人来说 ...
- 【Algorithm】自底向上的归并排序
一. 算法描述 自底向上的归并排序:归并排序主要是完成将若干个有序子序列合并成一个完整的有序子序列:自底向上的排序是归并排序的一种实现方式,将一个无序的N长数组切个成N个有序子序列,然后再两两合并,然 ...
- Java String首字母大写
一種寫法參考 public String upperFirstChar(String input) { if (input == null || "".equals(input)) ...
- [转]Github 简明教程
如果你是一枚Coder,但是你不知道Github,那么我觉的你就不是一个菜鸟级别的Coder,因为你压根不是真正Coder,你只是一个Code搬运工. 但是你如果已经在读这篇文章了,我觉的你已经知道G ...
- 常用的代码之一:用StopWatch计算代码运行花费的时间。
先引用Diagnostics using System.Diagnostics; 然后: Stopwatch stopWatch = new Stopwatch(); stopWatch.Start( ...
- python标准库介绍——36 popen2 模块详解
==popen2 模块== ``popen2`` 模块允许你执行外部命令, 并通过流来分别访问它的 ``stdin`` 和 ``stdout`` ( 可能还有 ``stderr`` ). 在 pyth ...
- Mac idea 执行testng用例,提示%MODULE_WORKING_DIR%目录不存在解决办法
idea 下载git代码 执行testng用例,报错: 下午4:47 Error running 'Test.apkStart': Cannot start process, the working ...