定义空的默认构造函数时会发生什么

What happens when you define an empty default constructor?

本文关键字:什么 构造函数 默认 定义      更新时间:2023-10-16

我搜索了之前的问题,并没有找到一个满意的答案:

如果我为一个类定义了一个空的默认构造函数,例如

class my_class{
public:
    myclass(){}
private:
    int a;
    int* b;
    std::vector<int> c;
}

我的理解是,如果我使用默认构造函数定义一个对象,说

my_class my_object;

然后my_object。A将是一个随机值,指针my_object。B也将是一个随机值,但是向量c将是一个表现良好的空向量。

换句话说,调用c的默认构造函数,而不调用a和b的默认构造函数。我理解对了吗?这是什么原因呢?

谢谢!

ab具有非类类型,这意味着它们根本没有构造函数。否则,你的描述是正确的:my_object.amy_object.b的值是不确定的,而my_object.c的构造是正确的。

至于为什么……通过编写用户定义的构造函数,并且在初始化列表中不提及ab(并且不使用c++ 11类内成员初始化器),您显式地要求编译器不初始化这些成员。

注意,如果您的类没有用户定义的构造函数,您可以通过在对象声明处指定初始化器,从外部控制my_object.amy_object.b的初始值

my_class my_object1;
// Garbage in `my_object1.a` and `my_object1.b`
my_class my_object2{};
// Zero in `my_object2.a` and null pointer in `my_object2.b`

但是当你编写自己的默认构造函数时,你实际上告诉编译器你想"覆盖"这个初始化行为,并自己做所有的事情。

由于ab不是对象,而是基本数据类型,因此没有可调用的构造函数。相反,c是一个对象,因此调用它的默认构造函数。