我搜索过以前的问题,但没有找到令人满意的答案:
如果我为类定义一个空的默认构造函数,例如
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的默认构造函数不是.我理解正确吗?这是什么原因?
谢谢!
a并且b具有非类类型,这意味着它们根本没有构造函数.否则,您的描述是正确的:my_object.a并且my_object.b将具有不确定的值,同时my_object.c将被正确构造.
至于为什么......写一个用户定义的构造函数,而不是提a并b在初始化列表中(而不是使用C++ 11类成员初始化)你明确要求编译器将这些成员初始化.
请注意,如果您的类没有用户定义的构造函数,则可以通过在对象声明点指定初始化程序来控制外部的初始值my_object.a和my_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)
但是当你编写自己的默认构造函数时,你有效地告诉编译器你要"覆盖"这个初始化行为并自己做所有事情.