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. 运维学习笔记(七)之T02-01计算机网络 、 数制 、 网络通信参考模型

    计算机网络 计算机网络概述 什么是计算机网络 硬件方面:通过线缆将网络设备和计算机连接起来 软件方面:操作系统.应用软件.应用程序通过通信线路互连 实现资源共享.信息传递 功能 数据通信/资源共享/增 ...

  2. QTemporaryDir及QTemporaryFile建立临时目录及文件夹

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QTemporaryDir及QTemporaryFile建立临时目录及文件夹     本文地址 ...

  3. HDU4466_Triangle

    今天比赛做的一个题目,不过今天终于感受到了复旦题目有多坑了. 题目的意思是给你一段长为n个单位长度的直线,你可以选择任意连续单位长度的线段组成三角形,可以组成任意你可以组成任意多个三角形,且要求其中所 ...

  4. BZOJ 4034 树上操作(树的欧拉序列+线段树)

    刷个清新的数据结构题爽一爽? 题意: 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x ...

  5. 【明哥报错簿】之json转换报错---net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXXDO

    简单的json和bean转换直接用: public static void main(String[] args) { String s = "{'request': [{'orderCod ...

  6. C++解析-外传篇(1):异常处理深度解析

    0.目录 1.异常的最终处理 2.结束函数terminate() 3.小结 1.异常的最终处理 问题: 如果在main函数中抛出异常会发生什么? 如果异常不处理,最后会传到哪里? 下面的代码的输出什么 ...

  7. Golden Tiger Claw UVA - 11383(km原理)

    这题使我对km多了一些看法 写给自己看.. km结束后bx[i] + by[j] == w[i][j], 所以所有bx与by的和即为w的和 而且记住bx[i] + by[j] >= w[i][j ...

  8. 【刷题】BZOJ 4573 [Zjoi2016]大森林

    Description 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力.小 ...

  9. windows主机防护

    Netsh命令-修改网络IP设置 网络管理相关函数 Windows用户相关操作 SID(安全标识符) 策略其他说明 主机防护设置 命令行添加防火墙 防火墙规则 使用SetupDI* API列举系统中的 ...

  10. 康托展开&康托逆展开 的写法

    康托展开 康托展开解决的是当前序列在全排序的名次的问题. 例如有五个数字组成的数列:1,2,3,4,5 那么1,2,3,4,5就是全排列的第0个[注意从0开始计数] 1,2,3,5,4就是第1个 1, ...