c++11 委派构造函数
委派构造函数可以减少构造函数的书写量:
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 委派构造函数的更多相关文章
- C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
C# DateTime的11种构造函数 别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...
- C++11:移动构造函数的测试
C++11:移动构造函数的测试 代码如下: #include <iostream> #include <stddef.h> #include <Windows.h> ...
- C# DateTime的11种构造函数
别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Globalization; using Syste ...
- c++11 move构造函数和move operator 函数 学习
先看个代码吧!!!!!!!!!! #include <iostream> using namespace std; class A { public: A(){cout<<&q ...
- [C++11] 默认构造函数
类通过一个特殊的构造函数来控制默认初始化过程.这个函数就是默认构造函数.默认构造函数无需不论什么实參. 我们能够显示的定义默认构造函数也能够让编译器为我们生成默认构造函数. 默认构造函数以例如以下规则 ...
- c++11的构造函数继承
https://en.cppreference.com/w/cpp/language/using_declaration 在[Inheriting constructors]这一节. 其实叫做"基类的 ...
- c++11 继承构造函数
若基类拥有数量众多的不同版本的构造函数,而派生类中只有一些成员函数,则对于派生类而言,其构造函数就等同于构造基类. struct A { A(int i) {} A(double d, int i) ...
- C++11实现模板手柄:委托构造函数、defaultkeyword分析
C++11.使用委托构造函数.和高速变量初始化,defaultkeyword重新声明默认构造函数,回答pod状态. 分析与推荐的方法. 到目前为止,VS2012和2013异常声明兼容还是停留在通信代码 ...
- C++11 构造函数的改动
一.继承构造函数 继承构造函数的引入原因:如果基类的构造函数很多,那么子类的构造函数想要实现同样多的构造接口,必须一一调用基类的构造函数,有点麻烦. 于是乎:C++11引入继承构造函数,子类可以通过使 ...
随机推荐
- vue自定义抽屉组件
<template> <div class="drawer"> <div :class="maskClass" @click=&q ...
- vue 项目的运行与 打包
1.vue init webpack 2.npm install axios 3.npm run dev 运行项目 4.npm run build 打包项目 会生成一个dist 文件夹,我们只需要把 ...
- Halo(六)
Spring publish-event 机制 监听者模式包含了一个监听者 Listener 与之对应的事件 Event,还有一个事件发布者 EventPublish. 过程就是 EventPubli ...
- IO操作之ObjectInputStream与ObjectOutputStream
之前写过DataInputStream和DataOutputStream,使用这两个类可以对java基本数据类型进行序列化和反序列化. 本篇再来两个新东西:ObjectInputStream,Obje ...
- 【Java】字符串转json
import org.json.JSONObject; JSONObject jo = new JSONObject(new String(需要转换的字符串));
- ThinkPHP整合datatables实现服务端分页
最近做东西有一个需求,因为数据量很大,在这里我决定使用datatables的服务端分页,同时还需要传递查询条件到服务端.在网上搜索的大部分文章都感觉有些误差,于是自己封装了一下,主要配置/工具为: 服 ...
- (63)C# 不安全代码unsafe
unsafe fixed stackalloc void*
- 配置github的pull request触发jenkins自动构建
参照: https://www.cnblogs.com/zanjiahaoge666/p/6402738.html 之前的配置,都是向master分支push操作触发jenkins进行构建,但是在一般 ...
- mongo 数据库存储
mongo 数据库,获取有赞的数据. from app import mongo from app.external.yz.goods_api import YzGoodsApi from openp ...
- oo_project_2java数据类型范围及测试
数据类型范围测试 一.数字常数的编译问题 java中的常量数字默认以int型编译 如: long a = 1234567890; //十位 long b = 12345678900; //默认数据为i ...