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. 软工1816 · 第八次作业(课堂实战)- 项目UML设计(团队)

    本次作业博客 团队信息 队名:起床一起肝活队 原组长: 白晨曦(101) 原组员: 李麒 (123) 陈德斌(104) 何裕捷(214) 黄培鑫(217) 王焕仁(233) 林志华(128) 乐忠豪( ...

  2. webpack打包多html开发案例新

    闲来无事在原来简单打包案例的基础上,参考vue-cli的打包代码,改为多文件打包. 区别于上篇文章<webpack打包多html开发案例>,此次打包根据开发的不同环节进行打包,也就是有开发 ...

  3. Java数学函数Math类

    Java数学函数Math类常用: Math.abs(12.3); //12.3 返回这个数的绝对值 Math.abs(-12.3); //12.3 Math.copySign(1.23, -12.3) ...

  4. web.py 笔记

    1.涉及到id=‘id’的情况,需要加入  vars=locals()  ,因为id在python里有id() 函数 db.delete('entries', where = 'id = $id', ...

  5. JDK1.8 之Lambda

    Lambda 理解的了很久才有一点小感觉. 语法 lambda表达式的特点,它的语法如下面. parameter -> expression body 下面是一个lambda表达式的重要特征. ...

  6. Java多线程 -yield用法

    前几天复习了一下多线程,发现有许多网上讲的都很抽象,所以,自己把网上的一些案例总结了一下! 一. Thread.yield( )方法: 使当前线程从执行状态(运行状态)变为可执行态(就绪状态).cpu ...

  7. 教你配置使用阿里云 Maven 库,体验秒下 jar 包的快感

    鉴于国内的网络环境,从默认 Maven 库下载 jar 包是非常的痛苦. 速度慢就不说了,还经常是下不下来,然后一运行就是各种 ClassNotFoundException,然后你得找到残留文件删掉重 ...

  8. HDU4054_Hexadecimal View

    水题.直接八位八位地枚举即可. 注意控制输出,注意读数的时候要把s中的全部元素置零. #include <iostream> #include <cstdio> #includ ...

  9. BZOJ 2462 矩阵模板(二维hash)

    题意:给出一个n*m的01矩阵,以及k个a*b的01矩阵,问每个是否能匹配原来的01矩阵. 由于k个矩阵的长和宽都是一样的,所以把原矩阵的所有a*b的子矩阵给hash出来.然后依次查找是否存在即可. ...

  10. 洛谷P2740 [USACO4.2]草地排水Drainage Ditches

    题目背景 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没 ...