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

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. TortoiseGit操作之提交代码到远程库

    1.在本地代码库的文件夹中,"右键" 2.GIT提交要求必须填写Commit message,请认真填写描述信息. 建议填写的变更项编号,如上图. 代码提交到本地的配置库中,然后p ...

  2. AcWing 260. 买票 (树状数组+二分)打卡

    题目:https://www.acwing.com/problem/content/description/262/ 题意:给定一个队伍,每个人过来的时候可以插队,每个人会输入一个插入到哪个位置,但是 ...

  3. ElasticSearch 简介概念及核心

    1.ES是什么 ES是面向文档的Nosql,这意味着它可以存储整个对象或文档.然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索.在es中,你可以对文档(而非成行成列的数据)进行索 ...

  4. tomcat正常启动输入localhost:8080显示404错误

    找了半天才解决. 看这个贴子: https://www.cnblogs.com/lovelanglangyou/p/7410937.html 简而言之: 需要修改eclipse中的server配置,e ...

  5. hdu 5396 Expression

    考虑到此题麻烦了某hust大神&体现出了自己数学能力的欠缺 虽然最近一直比较忙 还是把这题的题解写下来吧 首先看完数据范围后 应该有不少人会反应到是$n^3$的DP 以$F[i][j]$表示从 ...

  6. 《单词的减法》state1~state17(第二遍学习记录)

    单词的减法(二) 2016.05.18.2016.05.21 state 1 advisory 顾问的,劝告的 anticipate/participate 期望/参加 state 2 applian ...

  7. 基于spark邮件自动分类

    代码放在github上:click me 一.数据说明 数据集为英文语料集,一共包含20种类别的邮件,除了类别soc.religion.christian的邮件数为997以外每个类别的邮件数都是100 ...

  8. Cocos2d Box2D之简介

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. Box2D是一个用于模拟2D刚体物体的C++引擎.Box2D集成了大量的物理力学和运动学的计算,并将物理模拟过程封装到类对象中,将对物体的 ...

  9. MSF——Meterpreter(三)

    MSF系列: MSF——基本使用和Exploit模块(一) MSF——Payload模块(二) MSF——Meterpreter(三) MSF——信息收集(四) 一.简介 Meterpreter是Me ...

  10. java中Comparator比较器顺序问题,源码分析

    提示: 分析过程是个人的一些理解,如有不对的地方,还请大家见谅,指出错误,共同学习. 源码分析过程中由于我写的注释比较啰嗦.比较多,导致文中源代码不清晰,还请一遍参照源代码,一遍参照本文进行阅读. 原 ...