2.1 构造器(constructor)
2.1.1 定义
在类对象创建时,自动调用,完成类对象的初始化。尤其是动态堆内存的申请。
规则:
- 在对象创建时自动调用,完成初始化相关工作。
- 无返回值,与类名同,
- 可以重载,可默认参数。
- 默认无参空体,一经实现,默认不复存在
2.1.2 参数初始化表
例:Stack::Stack(int size) :space(new int[size]),top(0) { }
结论:
- 此格式只能用于类的构造函数。
- 初始化列表中的初始化顺序,与声明顺序有关,与前后赋值顺序无关。
- 必须用此格式来初始化非静态 const 数据成员(c++98)。
- 必须用此格式来初始化引用成员数据;
2.2 析构器
2.2.1 定义
class A { ~A() {} }
在类对像销毁时,自动调用,完成对象的销毁。尤其是类中己申请的堆内存的释放。
对象销毁时间:栈对象离开其作用域。堆对象被手动delete。
规则:
- 对象销毁时,自动调用。完成销毁的善后工作。
- 无返值,与类名同,无参。不可以重载与默认参数。
- 系统提供默认空析构器,一经实现,不复存在。
2.2.2 小结
析构函数的作用,并不是删除对象,而在对象销毁前完成的一些清理工作。
2.3 拷贝构造
2.3.1 定义
由己存在的对象,创建新对象。也就是说新对象,不由构造器来构造,而是由拷贝构造 器来完成。拷贝构造器的格式是固定的。

规则:
- 系统提供默认的拷贝构造器,一经定义不再提供。
- 系统提供的是等位拷贝,也就是所谓的浅浅的拷贝。
- 要实现深拷贝,必须要自定义。
2.3.2 拷贝构造发生的时机
- 制作对象的副本。
- 以对象作为参数和返回值。
2.3.3 深拷贝与浅拷贝
浅拷贝只会拷贝对象的第一层属性,如果这些属性是对象,则不会对这些对象进行拷贝,而是直接复制对象的引用。这意味着,对于浅拷贝后的对象,如果原对象的属性值发生了变化,浅拷贝后的对象的属性值也会跟着发生变化。”其实就是对象里边如果还有对象,浅拷贝之后,被拷贝的对象里边的这个对象只是个引用。当A对象里边的对象改变,B对象里边的对象也会受到影响。
浅拷贝 如果当数组或对象中的值是`基本类型数据`,那拷贝后的数据和原数据是完全没有关联,且互不影响的两个数据, 如果数组或对象的值是`引用类型数据`的话,拷贝后的数组或对象中的引用类型的值跟原数据中的引用类型的值,还是会保持共同的内存地址。
在进行深拷贝时,会拷贝所有的属性,并且如果这些属性是对象,也会对这些对象进行深拷贝,直到最底层的基本数据类型为止。这意味着,对于深拷贝后的对象,即使原对象的属性值发生了变化,深拷贝后的对象的属性值也不会受到影响。
2.4 this指针
2.4.1 定义
系统在创建对象时,默认生成的指向当前对象的指针。这样作的目的,就是为了带来方 便。
2.4.2 作用
- 避免构造器的入参与成员名相同。
- 基于 this 指针的自身引用还被广泛地应用于那些支持多重串联调用的函数中。 比如连续赋值。

2.5 赋值运算符重载(operator=)
用一个已有对象给另一个已有对象赋值。

规则:
- 系统提供默认的赋值运算符重载,一经定义不再提供。
- 系统提供的也是等位拷贝,也就浅拷贝,会造成内存泄漏,重析构。
- 要实现深深的赋值,必须自定义。
- 自定义面临的问题有三个:
- 自赋值
- 内存泄漏
- 重析构。
- 返回引用,且不能用 const 修饰。


1586

被折叠的 条评论
为什么被折叠?



