CPP 默认构造函数和成员初始化列表

cpp default constructor and member initialization list?

本文关键字:初始化 列表 成员 默认 构造函数 CPP      更新时间:2023-10-16
class test
{
public:
    test(int x)
    {
        val = x;
    }
private:
    int val;
};
test t(3);

我得到了关于这段代码的 2 分。

  1. test t(3)会先调用默认构造函数,然后再执行val = 3

  2. 如果至少存在用户定义的构造函数,则编译器不会生成隐式默认构造函数

有矛盾吗?

test t(3);

正在调用参数化的构造函数(参数为 3(而不是默认构造函数。是的,如果您使用参数定义单个构造函数,则编译器不会生成 dfault 构造函数。

test t(3)会先调用默认构造函数,然后再执行val = 3

不调用默认构造函数。 valtest 构造函数主体之前默认初始化;如果val是具有默认构造函数的类型,则将调用该构造函数。但是int没有构造函数,默认初始化只是让它处于未初始化状态,值不确定。

也许你在想这可能会调用test的默认构造函数。它没有;test 的任何构造函数都不会这样做,除非您显式委托给该构造函数。

如果至少存在用户定义的构造函数,则编译器不会生成隐式默认构造函数

这是正确的,声明任何构造函数都会阻止隐式默认构造函数。

有矛盾吗?

不。 test没有默认的构造函数,但这里没有任何东西试图使用这样的东西。

不,自定义构造函数不调用无参数构造函数,因此并不矛盾。

您可能将两件事混合在一起 - 每个构造函数都调用一个基类构造函数(默认的,或者如果您指定参数,则调用其他一些构造函数(。