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

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. 【leetcode】726. Number of Atoms

    题目如下: 解题思路:我用的是递归的方法,每次找出与第一个')'匹配的'('计算atom的数量后去除括号,只到分子式中没有括号为止.例如 "K4(ON(SO3)2)2" -> ...

  2. git基础常用命令

    常用命令 git init //初始化本地git环境 git clone XXX//克隆一份代码到本地仓库 git pull //把远程库的代码更新到工作台 git pull --rebase ori ...

  3. python使用bs4爬取boss静态页面

    思路: 1.将需要查询城市列表,通过城市接口转换成相应的code码 2.遍历城市.职位生成url 3.通过url获取列表页面信息,遍历列表页面信息 4.再根据列表页面信息的job_link获取详情页面 ...

  4. Java Web学习总结(1)Tomcat使用教程

    一,简介 Tomcat是一个实现了JAVA EE标准的最小的WEB服务器,是Apache 软件基金会的Jakarta 项目中的一个核心项目,由Apache.Sun 和其他一些公司及个人共同开发而成.因 ...

  5. PHP数据如何向上取整

    PHP数据如何向上取整? PHP数据向上取整可以通过ceil()函数来实现,ceil()函数表示向上舍入为最接近的整数. 语法是: 1 ceil(x) 参数 x 必需.一个数. 说明 返回不小于 x ...

  6. 数据挖掘:周期性分析SMCA算法

    数据挖掘:周期性分析SMCA算法 原文地址:http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1423978 算法介绍 以时间顺序挖掘周期性的模式 ...

  7. 使用C#登录带验证码的网站

    我在上一篇文章中已经讲解了一般网站的登录原来和C#的登录实现,很多人问到对于使用了验证码的网站该怎么办,这里我就讲讲验证码的原理和对应的登录方法.验证码的由来几年前,大部分网站.论坛之类的是没有验证码 ...

  8. bugku | login2(SKCTF) 200

    在响应包里面发现tips,base64解码后看到提示信息: $sql="SELECT username,password FROM admin WHERE username='". ...

  9. 20175126《Java程序设计》第十周学习总结

    # 20175126 2016-2017-2 <Java程序设计>第十周学习总结 ## 教材学习内容总结 - 本周学习方式主要为手动敲代码并理解内容学习. -本周学习十二章,主要内容如下: ...

  10. 2018-2019-2 网络对抗技术 20165206 Exp7 网络欺诈防范

    - 2018-2019-2 网络对抗技术 20165206 Exp7 网络欺诈防范 - 实验任务 (1)简单应用SET工具建立冒名网站 (1分) (2)ettercap DNS spoof (1分) ...