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 月,苹果开发者 ...
随机推荐
- Android网络开发之蓝牙
蓝牙采用分散式网络结构以及快调频和短包技术,支持点对点及点对多点通信,工作在全球通用的2.4GHz ISM(I-工业.S-科学.M-医学)频段,其数据速率为1Mbps,采用时分双工传输方案. 蓝牙 ...
- 如何写UI及屏幕适配的一些技巧
总结一下关于UI布局及屏幕适配的一些实战技巧,尤其使用纯代码,会对提升效率及代码易于维护等方面有明显帮助,这里提到的没有使用任何Xib, 如果不是在外包公司,也推荐大家多使用甚至完全使用纯代码布局UI ...
- [转] mysql --prompt介绍
mysql --prompt修改命令行链接mysql时的提示符,shell脚本示例如下 #!/bin/bash case $1 in crm) cmd='mysql -h192.168.1.2 -ur ...
- XmlSerializer 对象序列化成XML 自定义编码格式(gb2312)
随着面向服务(SOA)的开发方式的兴起,客户端和服务端之间的消息传送,很多采用了XML的格式.但是大家在日常的开发中,应该会有这么种体验,就是组织xml格式的代码太繁琐,这篇随笔也是为了和大家分享下简 ...
- 关于 os模块的常用用法
作为常用模块中的os模块,需要掌握的用法是非常重要的,今天就在这里把它归纳总结总结,以便自己日后的使用 一.os模块 含义:提供程序与操作系统直接操作的各个功能 二.常用的几个用法 os.getcwd ...
- Oracle 12C -- ADRCI查看DDL日志
$ adrci ADRCI: Release - Production on Tue Nov :: Copyright (c) , , Oracle and/or its affiliates. Al ...
- 【转载并整理】mysql 1293错误 建表两个timestamp
http://www.jb51.net/article/50878.htm 这里要使用到mysql的触发器
- 【转载】Spring Cache介绍
原文地址:http://www.cnblogs.com/rollenholt/p/4202631.html 缓存是实际工作中非常常用的一种提高性能的方法, 我们会在许多场景下来使用缓存. 本文通过一个 ...
- Java 8 – Convert a Stream to LIST
Java 8 – Convert a Stream to LIST package com.mkyong.java8; import java.util.List;import java.util.s ...
- ReferenceError: weakly-referenced object no longer exists Python kafka
Python存入kafka报错,ReferenceError: weakly-referenced object no longer exists. Exception in thread 14: p ...