委派构造函数可以减少构造函数的书写量:

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

每个构造函数都需要初始化列表来初始化成员type和name,且都调用了相同的函数InitRest,存在重复。

而在C++11中,可以使用委派构造函数来简化代码,如下:

class Info {
public:
Info() { InitRest(); } //称为目标构造函数(被调用)
Info(int i) : Info() { type = i; } //委派构造函数(调用者)
Info(char e) : Info() { name = e; } private:
void InitRest() { // other int }
int type {};
char name {'a'};
};

委派构造函数只能在函数体内为type,name等成员赋值,因为委派构造函数不能有初始化列表。C++中,构造函数不能同时使用委派和初始化列表。

初始化列表的初始化总是先于构造函数完成,作一下修改:

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;
};

在构造函数比较多时,可以有不止一个委派构造函数,目标函数也可以是委派构造函数,可以在委派构造函数中形成链状的委派构造关系。

class Info {
public:
Info() : Info() {}
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;
};

委派构造函数的应用:

1.模板:

#include <list>
#include <vector>
#include <deque> using namespace std; class TDConstructed {
template<class T>
TDConstructed(T first, T last) : l(first, last) {} list<int> l; public:
TDConstructed(vector<short> & v) : TDConstructed(v.begin(), v.end()) {}
TDConstructed(deque<int> & d) : TDConstructed(d.begin(), d.end()) {}
}

以上定义了一个构造函数模板,通过两个委派构造函数的委托,构造函数模板被实例化。

2. 异常处理:

#include <iostream>
using namespace std; class DCExcept(double d) try : DCExcept(, d) {
cout << "Run the body." << endl;
} catch(...) {
cout << "caught exception." << endl;
} private:
DCExcept(int i, double d) {
cout << "going to throw!" << endl;
throw ;
} int type;
double data;
}; int main() {
DCExcept a(1.2);
}

目标函数中抛出异常,可以在委派构造函数中捕获。

c++11 委派构造函数的更多相关文章

  1. C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库

    C# DateTime的11种构造函数   别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...

  2. C++11:移动构造函数的测试

    C++11:移动构造函数的测试 代码如下: #include <iostream> #include <stddef.h> #include <Windows.h> ...

  3. C# DateTime的11种构造函数

    别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Globalization; using Syste ...

  4. c++11 move构造函数和move operator 函数 学习

    先看个代码吧!!!!!!!!!! #include <iostream> using namespace std; class A { public: A(){cout<<&q ...

  5. [C++11] 默认构造函数

    类通过一个特殊的构造函数来控制默认初始化过程.这个函数就是默认构造函数.默认构造函数无需不论什么实參. 我们能够显示的定义默认构造函数也能够让编译器为我们生成默认构造函数. 默认构造函数以例如以下规则 ...

  6. c++11的构造函数继承

    https://en.cppreference.com/w/cpp/language/using_declaration 在[Inheriting constructors]这一节. 其实叫做"基类的 ...

  7. c++11 继承构造函数

    若基类拥有数量众多的不同版本的构造函数,而派生类中只有一些成员函数,则对于派生类而言,其构造函数就等同于构造基类. struct A { A(int i) {} A(double d, int i) ...

  8. C++11实现模板手柄:委托构造函数、defaultkeyword分析

    C++11.使用委托构造函数.和高速变量初始化,defaultkeyword重新声明默认构造函数,回答pod状态. 分析与推荐的方法. 到目前为止,VS2012和2013异常声明兼容还是停留在通信代码 ...

  9. C++11 构造函数的改动

    一.继承构造函数 继承构造函数的引入原因:如果基类的构造函数很多,那么子类的构造函数想要实现同样多的构造接口,必须一一调用基类的构造函数,有点麻烦. 于是乎:C++11引入继承构造函数,子类可以通过使 ...

随机推荐

  1. SpringMvc处理模型数据(也就是从数据库中查询出来的数据放到请求域中)

    这讲的是从数据库中查询到的数据,存放到请求域中.然后页面上直接可以从请求域中获取值. 有4种方式: 1):ModelAndView   是作为一个对象. /** * 目标方法的返回值可以是 Model ...

  2. JS中数据结构之图

    图由边的集合及顶点的集合组成.边是有方向的是有序图(有向图),否则就是无序图(无向图).图中的一系列顶点构成路径,路径中所有的顶点都由边连接.路径的长度用路径中第一个顶点到最后一个顶点之间边的数量表示 ...

  3. PCB底层打印到热转印纸上 Altium Designer

     切记:如果是TopLayer,应该勾选镜像打印(Mirror)  切记:底层Bottom Layer ,不勾选镜像

  4. 【BZOJ2639】矩形计算(二维普通莫队)

    题意:输入一个n*m的矩阵,矩阵的每一个元素都是一个整数,然后有q个询问,每次询问一个子矩阵的权值. 矩阵的权值是这样定义的,对于一个整数x,如果它在该矩阵中出现了p次,那么它给该矩阵的权值就贡献p^ ...

  5. 【CF741D】Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)

    题意:我们称一个字符串为周驿东串当且仅当重排它的字符可以组成一个回文串. 给出一个n个点的有根树,根为1,每条边上有一个从a到v的字符,求每个点的子树中所有简单路径可以组成的周驿东串中的最长长度. n ...

  6. Gym10198-Mediocre String Problem-2018南京ICPC现场赛

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门  Portal  原题目描述在最下面. Solu ...

  7. Linux:主设备号和次设备号

    http://www.linuxidc.com/Linux/2011-03/33863.htm     Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备 ...

  8. phpredis报错信息:protocol error, got 'o' as reply type byte解决方案

    今天在前端调用PHP的接口时,有报错信息为:protocol error, got 'o' as reply type byte另外此错误有几率会重现,并不是必现的.十分疑惑,遂百度一下,发现是red ...

  9. bzoj 2242: [SDOI2011]计算器 & BSGS算法笔记

    这题的主要难点在于第三问该如何解决 于是就要知道BSGS是怎样的一种方法了 首先BSGS是meet in the middle的一种(戳下面看) http://m.blog.csdn.net/blog ...

  10. English-such as, for example, include and contain

    such as 后接动词,通常用动名词,有时也可用动词原形 for example 后接动词,用动名词 include vt. 包含,包括 后接动词,用动名词 英英: If one thing inc ...