class A
{
int a;
int b;
int c;
public:
A(int aa, int bb) : a(aa), b(bb),c(0) { cout << "aa bb" << endl; }
A(int aa, int bb, int cc);
};

上面类中,已经有一个构造函数,形参有两个,我们又重载一个有3个形参的构造函数,为了减少代码量,就想着让3个参数的构造函数调用2个参数的构造函数,然后在执行一些自己的代码,这就如同派生类先调用基类的同名函数,在执行自己特有的代码。这种机制如何实现呢?

做法一:在3个参数中显示调用2个参数的构造函数(这肯定是可以的, 构造函数是类的成员函数),此时要用到placement new技术。

3参数构造函数可以这样实现:

	A::A(int aa, int bb, int cc)
{
new (this) A(aa, bb);
...
}

构造函数有2个执行阶段:1)是在初始化列表的初始化阶段;2)在构造函数体内的赋值阶段。上述方法是在第二个阶段。placement new技术的形式是 new(void *p) Type(...),表示在p所指的内存区域调用Type构造函数,该过程没有内存请求。上述实现有“投机取巧”之嫌,就是在对象地址处,调用2个参数的构造函数重新生成一个新的对象然后覆盖该对象。

做法二:在VS2013中发现可以在构造函数初始化列表直接调用,类似于调用基类构造函数。该方法在g++中不适合。

	A::A(int aa, int bb, int cc) :A(aa, bb)
{
...
}

上述说了构造函数有2个执行阶段,该方法是在第一个阶段进行的,这种方式有点类似C#里面的机制,更加方便。该方法有个注意事项是不能在A(aa, bb)后面在接c(cc)了,因为调用2个参数的构造函数之后,就相当于该对象已经初始化完成了,不能在初始化列表放入其他成员的初始化形式。只能放在构造函数体中的赋值阶段。该方法目前只能用在VS2013中。

做法二有很大的局限性,不过确实很方便。不知标准文档对于构造函数互相调用有怎样的规定?是否以后其他编译器会加入该功能?

C++类中一个构造函数调用另一个构造函数的更多相关文章

  1. C++类中的特殊成员函数-------复制构造函数

    在C++中存在一个特殊函数,他就是复制构造函数,假如我们有类A,如果有A a;A b=a;   在这种情况下利用A类变量a来给同是A类变量的b来赋值,这个时候类会使用复制构造函数,如果我们不显式声明复 ...

  2. C++ - 一个构造函数调用构造函数的问题

          今天做C++的实验,题目是写一个二维点的类,然后让一个三维点的类继承它然后扩展.题目是一般学面向对象语言的常用例子.       然后遇到一个这样的问题:之前用Java的时候写构造方法的时 ...

  3. 在Java中如何用String类中的indexof方法得到一个词的出现频率

    public class Test{ public static void main(String[] args) { String s="hello jack hello look me ...

  4. C#中,子类构造函数调用父类父类构造函数的正确方式

    正确调用的方式是:

  5. @Transactional-同一个类中方法自调,调用方法事物失效

    问题分析 一个类中的方法调用另一个事物传播性为创建事物的方法,调用的方法事物失效? SpringAOP 代理的Service对象调用了其方法,这个方法再去调用这个Service中的其他方法是没有使用A ...

  6. OC中给我们提供的一个技术:谓词(NSPredicate).note

    OC中给我们提供的一个技术:谓词(NSPredicate)OC中的谓词操作是针对于数组类型的,他就好比数据库中的查询操作,数据源就是数组,这样的好处是我们不需要编写很多代码就可以去操作数组,同时也起到 ...

  7. java初始化构造函数调用顺序

    类初始化时构造函数调用顺序: (1)初始化对象的存储空间为零或null值:  (2)调用父类构造函数:  (3)按顺序分别调用类成员变量和实例成员变量的初始化表达式:  (4)调用本身构造函数. 例子 ...

  8. C++继承 派生类中的内存布局(单继承、多继承、虚拟继承)

    今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的.看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用. ——谈VC++对象模型(美)简.格雷程化    译 译者前言 一个C ...

  9. C++类中函数(构造函数、析构函数、拷贝构造函数、赋值构造函数)

    [1]为什么空类可以创建对象呢? 示例代码如下: #include <iostream> using namespace std; class Empty { }; void main() ...

随机推荐

  1. Pandas 基础(8) - 用 concat 组合 dataframe

    以各个城市的天气为例, 先准备下面的数据: 印度天气的相关信息: import pandas as pd india_weather = pd.DataFrame({ 'city': ['mumbai ...

  2. 【CentOS&Core】CentOS7下安装.NET Core SDK 2.1

     1.导入rpm源 sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm 2.更 ...

  3. 放大镜jQuery效果

    今天我们来写一下jQuery的效果来上代码 1,html代码 <div id='small'><img src="./icon/images/sj1.jpg" a ...

  4. 特效 左右滑动轮播图jQuery思路

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 服务列表中找不到mysql

    服务列表中找不到mysql - 解决办法 1.在开始处输入cmd,找到cmd选择以管理员身份运行(必须以管理员运行,直接win+r打开无效) 2.进入到MySQL安装目录的bin目录 3.执行mysq ...

  6. FileProvider 添加二级目录

    我们在做Android N升级适配的时候 传统的Intent调用文件的方式会被认为不安全的 然后系统需要让我们使用更加安全的FileProvider的方法去构建intent请求 如 拍照,安装新的ap ...

  7. Systemd程序及相关命令

    Systemd程序及相关命令 Systemd是一款用于Linux操作系统系统管理和服务管理的工具.它向后兼容SysV init脚本,并且支持许多类似于startup系统服务的功能,比如系统快照(sna ...

  8. vue的组件之间传值方法

    父组件 <template> <div> 这是父组件 <children v-bind:parentToChild="toChild" v-on:sh ...

  9. linux搭建node环境

    这篇完全够了! 地址:https://www.cnblogs.com/lovefc/p/8847343.html 附上一张图:

  10. 兼容 Spring Boot 1.x 和 2.x 配置类参数绑定的工具类 SpringBootBindUtil

    为了让我提供的通用 Mapper 的 boot-starter 同时兼容 Spring Boot 1.x 和 2.x,增加了这么一个工具类. 在 Spring Boot 中,能够直接注入 XXProp ...