系统定义的构造函数与C++中用户定义的构造函数
System defined Constructors Vs user defined constructors in C++
为什么我们需要定义运算符或复制构造函数,因为它们是系统提供的默认构造函数?请用
当您需要与默认编译器提供的函数实现的行为不同的行为时,您需要提供它们。
默认的复制构造函数按值复制所有成员。默认分配运算符按值分配所有成员。在很多情况下,这正是您想要的,因此不需要提供自己的实现。但事实并非总是如此。
考虑一下这个人为的例子:
struct Broken {
Broken() : i(42), p(new int) { }
~Broken() { delete p; }
int i;
Int* p;
};
它将获得默认的编译器生成的副本ctor和operator=,但在这种情况下,它们不会做你想做的事——考虑一下:
int main()
{
Broken b1;
Broken b2 = b1;
} // you'll probably crash here with a double free
发生的情况是,b1
在其i
成员中存储42,然后在堆上分配一个新的int,并将地址存储在p
成员中(假设地址为0x1234)。然后,我们从b1
构造b2
,默认的复制构造函数愉快地将b2.i
赋值为42——这很好。它还指定b2.p
的值为0x1234——这不是您想要的。现在,两个对象都持有指向同一内存的指针,并且它们的析构函数都将尝试delete
它。因此,当b2
在main
结束时超出范围时,它会处理内存——到目前为止还不错——但随后b1
也超出范围,并试图释放已经释放的内存,而您的程序现在已损坏。
在这种情况下,您可能希望提供自己的运算符=和复制ctor,它们不会天真地复制指针的值,而是对指针指向的任何对象进行深度复制,并将其存储在与原始对象不同的新内存块中,这样两个对象都有自己的唯一副本。
还有很多其他的例子,但这是我能想到的最简单的例子。
相关文章:
- 具有enable_if外部类原型的模板类构造函数定义
- 构造函数定义中类声明中的模板值
- C++中的继承和构造函数定义
- 如何使用模板化构造函数定义演绎指南?
- 构造函数定义C
- 不正确的成员构造函数定义
- 具有虚拟多重继承的构造函数定义
- C++谷歌测试在哪里放置测试夹具构造函数定义
- 模板类定义中的模板构造函数定义
- C++下面给出的代码中的构造函数定义差异
- 带继承的构造函数定义
- 无法访问构造函数定义之外的变量
- 调用构造函数定义中的函数后收到Segmentation Fault 11错误
- 将具有默认值的构造函数定义为组合对象的私有字段
- 防止重新定义构造函数定义的方法
- 继承构造函数-定义可移植的固定大小类型(C++)
- 在类的私有部分为复制构造函数定义原型如何防止类的复制
- 如何指定继承类的构造函数定义
- 了解默认移动构造函数定义
- 理解构造函数定义块的语法变化