1、委托构造函数

  委托构造函数就是允许在同一个类中一个构造函数可以调用另一个构造函数,从而在初始化时简化变量的初始化。

class CTest
{
public:
int x;
int y;
int z; public:
CTest(int a)
{
x = a;
} CTest(int a, int b)
{
x = a;
y = b;
} CTest(int a, int b, int c)
{
x = a;
y = b;
z = c;
} ~CTest(){}
};

  这个例子表明,在成员变量众多、变量的初始化比较复杂的情况下,构造函数的工作是重复且繁琐的,那么就可以通过委托构造函数来解决问题。

class CTest
{
public:
int x;
int y;
int z; public:
CTest(int a)
{
x = a;
} CTest(int a, int b) : CTest(a)
{
y = b;
} CTest(int a, int b, int c) : CTest(a, b)
{
z = c;
} ~CTest(){}
};

  这样优化之后,代码更加的简洁明了,但是这种链式调用不能形成一个环,否则会在运行时候抛异常。其次,使用了代理构造函数就不能使用类成员初始化了。

class CTest
{
public:
int x;
int y;
int z; public:
//没有调用构造函数可以进行初始化
CTest(int a) : x(a)
{} //error:调用了构造函数不能进行初始化
CTest(int a, int b) : CTest(a), y{b}
{
} //ok,调用了构造函数,可以在函数内部进行赋值
CTest(int a, int b, int c) : CTest(a, b)
{
z = c;
} ~CTest(){}
};

2、继承构造函数

  C++11的集成构造函数可以让派生类直接使用基类的构造函数,而无需自己再写构造函数,特别是基类构造函数比较多的情况下,可以极大的简化派生类构造函数的编写。

struct A
{
int x;
int y;
//...其他成员 A(int a) : x(a) {};
A(int a, int b): x(a), y(b) {};
//...其他构造函数
};

  如果派生类仅仅是增加基类某些行为,并没有增加变量,那么希望采取基类一样的构造方式,是不能直接使用基类的构造函数的,因为派生类会隐藏基类的同名函数。

struct B : public A
{
//add do something
}; int main()
{
B b(, ); //编译错误,没有合适的构造函数
return ;
}

  通过基类的构造函数去构造派生类的对象是不合法的,因为派生类的默认构造函数隐藏了基类,如果希望使用基类的构造函数,常规的做法是在派生类定义。

struct B : public A
{
B(int a) : A(a) {};
B(int a, int b): A(a, b) {};
//...其他基类构造函数
};

  通过这个方法解决了和基类一样的构造行为,但是过程既繁琐又重复,C++11中解决了派生类隐藏基类同名函数的问题,通过using Base::SomeFunction来表示使用基类的同名函数,如果是构造函数,使用using Base::Base来声明使用基类的构造函数,这样就避免了定义相同的构造函数来保持和基类一样的初始化行为,使用基类的构造函数来构造派生类对象。但是需要注意的是,集成构造函数不会去初始化派生类新定义的数据成员。

struct B : public A
{
//基类构造函数
using A::A; //基类其他函数
using A::SomeFunction;
};

C11构造函数的改善的更多相关文章

  1. C11关键字&字面值改善

    1.原始字面值改善 原始字面值可以直接表示字符串的实际含义,但是一些特殊字符就需要转义. std::string str = "D:\A\B\test.txt"; std::cou ...

  2. js类式继承模式学习心得

    最近在学习<JavaScript模式>,感觉里面的5种继承模式写的很好,值得和大家分享. 类式继承模式#1--原型继承 方法 让子函数的原型来继承父函数实例出来的对象 <script ...

  3. c++ 吕凤翥 第六章 类和对象(二)

    c++ 吕凤翥 第六章 类和对象(二) 指针   引用  和数组 一:对象指针和对象引用 1.指向类的成员的指针 分为指向成员变量和指向成员函数两种指针 成员变量的格式:     类型说明符  类名: ...

  4. C++基础-类和对象

    本文为 C++ 学习笔记,参考<Sams Teach Yourself C++ in One Hour a Day>第 8 版.<C++ Primer>第 5 版.<代码 ...

  5. 编写高质量代码改善C#程序的157个建议——建议106:为静态类添加静态构造函数

    建议106:为静态类添加静态构造函数 静态类可以拥有构造方法,这就是静态构造方法.静态构造方法与实例构造方法比较有几个自己的特点: 只被执行一次,且在第一次调用类成员之前被运行时执行. 代码无法调用它 ...

  6. 编写高质量代码改善C#程序的157个建议——建议105:使用私有构造函数强化单例

    建议105:使用私有构造函数强化单例 单例指一个类型只生成一个实例对象.单例的一个简单实现如下所示: static void Main(string[] args) { Singleton.Insta ...

  7. [改善Java代码]不要在构造函数中抛出异常

    Java的异常机制有三种: 一.Error类以及其子类表示的是错误,它是不需要程序员处理也不能处理的异常.比如VirtualMachineError虚拟机错误,ThreadDeath线程僵尸等. 二. ...

  8. [改善Java代码]使用构造函数协助描述枚举项

    一.分析 一般来说,我们经常使用的枚举项只有一个属性,即排序号,其默认值是从0.1.2... ....但是除了排序号外,枚举还有一个(或多个)属性:枚举描述,它的含义是通过枚举的构造函数,声明每个枚举 ...

  9. [改善Java代码]建议40:匿名类的构造函数很特殊

    建议40: 匿名类的构造函数很特殊 在上一个建议中我们讲到匿名类虽然没有名字,但可以有一个初始化块来充当构造函数,那这个构造函数是否就和普通的构造函数完全一样呢?我们来看一个例子,设计一个计算器,进行 ...

随机推荐

  1. Web站点性能-宏观手段

    1,增加服务器配置,购买性能更强的服务器,cpu.增加内存.增加硬盘(换更大更好的硬盘): 2,修改优化程序: 1)增加缓存: 2)优化代码,优化sql: 3)分离静态资源和动态页面: 3,对服务承担 ...

  2. erlang转化中文为url

    今天使用http get 方法时,参量中有中文而导致出错. 例如http://abc.com/abc?arg=中文,在erlang使用http:request方法失败. 后来查了url的规范,url中 ...

  3. Windows下IntelliJ IDEA中调试Spark Standalone

    参考:http://dataknocker.github.io/2014/11/12/idea%E4%B8%8Adebug-spark-standalone/ 转载请注明来自:http://www.c ...

  4. gearman参数说明

    -b, –backlog=BACKLOG 连接请求队列的最大值 -d, –daemon Daemon 守护进程化 -f, –file-descriptors=FDS 可打开的文件描述符数量 -h, – ...

  5. 除了GPS外的4种获得用户地理位置数据的方法

    纯粹的GPS解决方案以及它所生成的经纬度标签是地理位置数据的公认标准.但是至少还有4种方法可以获得地理位置数据: 1.手机信号塔数据:当移动设备的GPS芯片不能接收到GPS信号时,移动设备就需要与它所 ...

  6. Shortest Prefixes POJ - 2001(统计次数)

    题意: 输出每个单词的缩写  使得每个单词 互不相同.. 解析: 统计每个前出现的次数...然后在查询的时候  遇到次数为1的返回即可.. #include <iostream> #inc ...

  7. 洛谷 P1233 木棍加工 解题报告

    P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...

  8. 2656: [Zjoi2012]数列(sequence)(递归+高精度)

    好久没写题了T T NOIP 期中考双血崩 显然f(x)=f(x>>1)+f((x>>1)+1),考虑每次往x>>1递归,求出f(x),复杂度O(logN) 我们设 ...

  9. 【loj2033】生成魔咒

    Portal --> loj2033 Solution 这题..虽然说好像也是sam的裸题不过既然在智力康复那就强制后缀数组吧qwq ​ (晚点再用sam写一次qwq) 首先如果是要求本质不同的 ...

  10. 【BZOJ 1129】[POI2008]Per 二叉堆

    这个东西读完题之后,就能知道我们要逐位计算贡献.推一下式子,会发现,这一位的贡献,是当前剩余的数字形成的序列的总数,乘上所剩数字中小于s上这一位的数的个数与所剩数字的总数的比.所以我们维护“当前剩余的 ...