前言
第一次看C++ Primer时拷贝控制这章完全没看明白,只是很粗略地过了一遍。时隔一年,具备了一定的工程经验后,再次看这一章对于类的拷贝构造/赋值函数、移动构造/赋值函数以及析构函数有了完全不一样的认识,在博客里记录一下,C++ Primer每看一遍都会有不同的收获倒真不是乱说。
拷贝构造/赋值函数
拷贝构造函数第一个参数必须是一个引用类型,且通常是一个const的引用。另外,拷贝构造函数会在很多情况下被隐式地使用,不应该为explicit函数。当我们没有显式地定义一个拷贝构造函数时,编译器会为我们定义一个,当然这个函数是不是符合我们的预期是存疑的。
拷贝构造函数在以下情况被使用到:
- 将一个对象作为实参传递给一个非引用类型的形参
- 从一个返回类型为非引用类型的函数返回一个对象
- 用花括号列表初始化一个数组中的元素或一个聚合类中的成员
与拷贝构造函数一样,类通过拷贝赋值函数对对象进行赋值,如果类未定义自己的拷贝赋值运算符,编译器会为它合成一个。
析构函数
析构函数主要的目的是释放对象在生存期内分配的资源,并销毁非static成员。同样在未自定义析构函数时,编译器会定义一个合成析构函数。
析构函数被调用的情况:
- 对象离开作用域
- 对象被销毁,其成员同时调用析构函数销毁
- 容器被销毁时,其元素被销毁
- 动态分配的对象,delete指针时被销毁
- 临时对象创建完成被销毁
拷贝和析构的注意点
C++语言虽然没有要求我们定义所有的这些操作,但是这三个操作通常需要作为一个整体来进行定义,下面给出原因
- 需要析构函数的类同时需要拷贝和赋值函数
设计类时,首先考虑的是应不应该为其自定义一个析构函数,从而避免某些类对象在使用默认析构函数时没有释放类中动态分配的内存,造成内存泄漏。
举个书里的例子
class HasPtr<