当有参构造函数进行非初始化列表构造时,是先执行成员默认初始化而非先执行默认构造函数

当不用参数初始化列表进行构造函数时,成员参数会首先进行默认初始化,之前有一段时间自己以为会调用默认构造函数来初始化,后来发现还是有区别的。遂记录如下。

代码

#include <iostream>

class A
{
public:
    A() { std::cout << "default construct" << std::endl; }
    A(int i)
    {
        a = i;
        std::cout << "int constructor" << std::endl;
    }

private:
    int a;
};

int main(int, char **)
{
    A a1(1); //这里调用有参构造函数,由于未用参数初始化列表,所以会将成员进行默认初始化
    A a2;    //这里调用的是默认构造函数
    return 0;
}

之前会以为当调用有参数的构造函数时,由于未用参数初始化列表,所以会首先调用默认构造函数,所以应当首先输出“default construct",然后输出"int constructor"。但是,实际上只会输出"int constructor",则证明并未调用默认构造函数。后来才理解是进行参数的默认初始化,而不是进行调用默认构造函数。


图 1 程序输出结果

结论

当有参构造函数进行非初始化列表构造时,是先执行成员默认初始化而非先执行默认构造函数
--2020.12.06

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 默认构造函数 默认的构造函数是指为所有参数都提供了默认值的构造函数,通常是指无参的构造函数。比如下面的类Test,...
    元素周期表的十七君阅读 3,635评论 0 0
  • 默认构造函数在被需要的时候被编译器产生出来。 这句话的关键部分是: 被谁需要? 什么时候被需要? 做什么事情? 被...
    哪有岁月静好阅读 1,163评论 0 0
  • C++新手一般有两个常见的误解: 任何class 如果没有定义default constructor,就会被合成出...
    VictorHong阅读 4,346评论 0 0
  • 默认构造函数:就是没有参数的构造函数,当创建实例,并且没有参数时,编译器就会调用默认构造函数。但是,如果用户没有给...
    祝方泽阅读 1,794评论 0 0
  • 如果一个类定义了若干成员变量又没有其他构造函数,需要定义一个默认构造函数,否则编译器将自动产生默认构造函数( De...
    吃柠檬的鸮阅读 1,742评论 0 0