我搜索了以前的问题,但没有找到令人满意的答案:
如果我为类定义一个空的默认构造函数,例如
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的默认构造函数不是。我理解正确吗?这是什么原因?
谢谢!
答案 0 :(得分:7)
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`
但是当你编写自己的默认构造函数时,你有效地告诉编译器你想要&#34;覆盖&#34;这种初始化行为并自己做所有事情。
答案 1 :(得分:2)
由于a
和b
不是对象而是原始数据类型,因此没有要调用的构造函数。相反,c
是一个对象,因此调用其默认构造函数。