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

use*_*430 1 c++

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

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

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

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

my_class my_object;
Run Code Online (Sandbox Code Playgroud)

那么my_object.a将是一个随机值,指针my_object.b也将是一个随机值,但是矢量c将是一个表现良好的空矢量.

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

谢谢!

AnT*_*AnT 7

a并且b具有非类类型,这意味着它们根本没有构造函数.否则,您的描述是正确的:my_object.a并且my_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`
Run Code Online (Sandbox Code Playgroud)

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

  • 注意`object o = object()`和`object o`之间的区别也很好;对于 POD 类型(无构造函数),前者将默认初始化所有成员,即使是没有构造函数的成员(将其位设置为 0)。类似地,在构造函数的初始化列表中,您可以编写 `:a(), b()`,它们也会默认将 `a` 和 `b` 初始化为 0。 (2认同)
  • 在答案中可能值得注意的是,一方面a和b之间的区别另一方面c在规范中被称为"微不足道"; a和b是微不足道的,而c则不是.或者为了进一步放大,a和b是可以简单地构造的,c则不是."微不足道"不同于POD和原始,许多人错误地引用它作为获得这种不同行为的标准. (2认同)