定义空的默认构造函数时会发生什么
What happens when you define an empty default constructor?
我搜索了之前的问题,并没有找到一个满意的答案:
如果我为一个类定义了一个空的默认构造函数,例如
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的默认构造函数。我理解对了吗?这是什么原因呢?
谢谢!
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`
但是当你编写自己的默认构造函数时,你实际上告诉编译器你想"覆盖"这个初始化行为,并自己做所有的事情。
由于a
和b
不是对象,而是基本数据类型,因此没有可调用的构造函数。相反,c
是一个对象,因此调用它的默认构造函数。
相关文章:
- 是什么让放置新调用对象的构造函数?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 使用基类指针调用基类的值构造函数的语法是什么?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 构造函数后面的宏.什么意思?
- C++构造函数内部会发生什么?
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 我是否为邪恶刽子手的构造函数错过了什么?
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 什么时候用指针调用C++类构造函数
- 这个构造函数是做什么的
- 将复制构造函数设置为private和=delete有什么区别
- 我不明白在这个例子中什么时候调用构造函数
- 在C++中,从构造函数中将字符串文本分配给成员const char*变量时会发生什么
- c++ 17 中结构自动定义构造函数的规则是什么?
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- 指示汇编时间叫什么构造函数
- 在这种情况下调用什么构造函数
- 使用什么构造函数