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

时间:2015-07-08 21:04:49

标签: c++

我搜索了以前的问题,但没有找到令人满意的答案:

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

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的默认构造函数不是。我理解正确吗?这是什么原因?

谢谢!

2 个答案:

答案 0 :(得分:7)

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`

但是当你编写自己的默认构造函数时,你有效地告诉编译器你想要&#34;覆盖&#34;这种初始化行为并自己做所有事情。

答案 1 :(得分:2)

由于ab不是对象而是原始数据类型,因此没有要调用的构造函数。相反,c是一个对象,因此调用其默认构造函数。