C11构造函数的改善
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构造函数的改善的更多相关文章
- C11关键字&字面值改善
1.原始字面值改善 原始字面值可以直接表示字符串的实际含义,但是一些特殊字符就需要转义. std::string str = "D:\A\B\test.txt"; std::cou ...
- js类式继承模式学习心得
最近在学习<JavaScript模式>,感觉里面的5种继承模式写的很好,值得和大家分享. 类式继承模式#1--原型继承 方法 让子函数的原型来继承父函数实例出来的对象 <script ...
- c++ 吕凤翥 第六章 类和对象(二)
c++ 吕凤翥 第六章 类和对象(二) 指针 引用 和数组 一:对象指针和对象引用 1.指向类的成员的指针 分为指向成员变量和指向成员函数两种指针 成员变量的格式: 类型说明符 类名: ...
- C++基础-类和对象
本文为 C++ 学习笔记,参考<Sams Teach Yourself C++ in One Hour a Day>第 8 版.<C++ Primer>第 5 版.<代码 ...
- 编写高质量代码改善C#程序的157个建议——建议106:为静态类添加静态构造函数
建议106:为静态类添加静态构造函数 静态类可以拥有构造方法,这就是静态构造方法.静态构造方法与实例构造方法比较有几个自己的特点: 只被执行一次,且在第一次调用类成员之前被运行时执行. 代码无法调用它 ...
- 编写高质量代码改善C#程序的157个建议——建议105:使用私有构造函数强化单例
建议105:使用私有构造函数强化单例 单例指一个类型只生成一个实例对象.单例的一个简单实现如下所示: static void Main(string[] args) { Singleton.Insta ...
- [改善Java代码]不要在构造函数中抛出异常
Java的异常机制有三种: 一.Error类以及其子类表示的是错误,它是不需要程序员处理也不能处理的异常.比如VirtualMachineError虚拟机错误,ThreadDeath线程僵尸等. 二. ...
- [改善Java代码]使用构造函数协助描述枚举项
一.分析 一般来说,我们经常使用的枚举项只有一个属性,即排序号,其默认值是从0.1.2... ....但是除了排序号外,枚举还有一个(或多个)属性:枚举描述,它的含义是通过枚举的构造函数,声明每个枚举 ...
- [改善Java代码]建议40:匿名类的构造函数很特殊
建议40: 匿名类的构造函数很特殊 在上一个建议中我们讲到匿名类虽然没有名字,但可以有一个初始化块来充当构造函数,那这个构造函数是否就和普通的构造函数完全一样呢?我们来看一个例子,设计一个计算器,进行 ...
随机推荐
- RIGHT-BICEP测试第二次
1.Right-结果是否正确? 正确 2.B-是否所有的边界条件都是正确的? 正确 3.P-是否满足性能要求? 部分满足 4.是否满足有无括号? 无 5.数字个数是否不超过十? 只是双目运算 6.能否 ...
- HDU 5234 Happy birthday 01背包
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5234 bc:http://bestcoder.hdu.edu.cn/contests/con ...
- IE劫持
解析雅虎与百度流氓原理- 为什么“浏览器劫持”能够如此猖狂呢?放眼众多论坛的求助贴,我们不时可以看到诸如“我的IE被主页被改了,我用杀毒工具扫了一遍都没发现病毒,我把主页改回自己的地址,可是一重启它又 ...
- Web-JSP表单字符验证
代码后续补上
- 将java开发的wordcount程序提交到spark集群上运行
今天来分享下将java开发的wordcount程序提交到spark集群上运行的步骤. 第一个步骤之前,先上传文本文件,spark.txt,然用命令hadoop fs -put spark.txt /s ...
- 【Leetcode】725. Split Linked List in Parts
Given a (singly) linked list with head node root, write a function to split the linked list into k c ...
- mysql 慢查询,查询缓存,索引,备份,水平分割
1.开启慢查询 在mysql的配置文件my.ini最后增加如下命令 [mysqld]port=3306slow_query_log =1long_query_time = 1 2.查看慢查询记录 默认 ...
- pixi.js tools
pixi群 881784250 Awesome pixi.js tools A list of useful libs/resources/tools for renowned html5 rende ...
- HSF源码剖析
前言 HSF是一个分布式的远程服务调用框架,其实我更喜欢把分布式几个字去掉,因为HSF本身并不是一个单独的服务(指一个进程),他是附属在你的应用里的一个组件,一个RPC组件(远程过程调用——Remot ...
- 51nod 1799 二分答案(分块打表)
首先题目等价于求出满足运行二分程序后最后r=k的排列种数. 显然对于这样的二分程序,起作用的只有mid点,mid处的值决定了接下来要递归的子区间. 于是可以一遍二分求出有多少个mid点处的值<= ...