13.9 析构函数:执行和构造函数相反的操作,释放对象所使用的资源,并销毁对象的非static成员。析构函数名字为~接类名,无返回值和参数;
合成析构函数先执行函数体(空函数体),后销毁成员。
当一个类没有定义析构函数时,编译器会合成析构函数。
13.10 销毁StrBlob对象:执行合成的析构函数,先执行空函数体,再销毁成员data,销毁data时调用shared_ptr的析构函数,将引用计数减1,引用计数为0则销毁共享的vector对象;
销毁StrBlobPtr对象:执行合成的析构函数,先执行空函数体,再销毁wptr和curr成员,销毁wptr时调用weak_ptr的析构函数,引用计数不变,curr为内置类型,直接销毁。
13.11 HasPtr的析构函数:
HasPtr::~HasPtr()
{
delete ps;
}
13.12 函数结束时,局部变量item1,item2,参数accum的生命期结束,会发生三次析构函数的调用。参数trans是指针,它指向的Sales_data对象生命期未结束,不会调用析构函数。
13.13 测试代码如下:
#include <iostream>
#include <vector>
using namespace::std;
struct X {
//构造函数
X() {
cout << "X()" << endl;
}
//拷贝构造函数
X(const X&) {
cout << "X(const X&)" << endl;
}
//拷贝赋值运算符
X& operator=(const X &) {
cout << "operator=(const X&)" << endl;
return *this;
}
//析构函数
~X() {
cout << "~X()" << endl;
}
};
void fun1(X p)
{
;
}
void fun2(X &p)
{
;
}
int main(int argc, char *argv[])
{
cout << "定义局部变量,构造函数:" << endl;
X x;
cout << "传递非引用参数,拷贝构造函数,销毁fun1()形参,析构函数" << endl;
fun1(x);
cout << "传递引用参数,无调用" << endl;
fun2(x);
cout << "动态分配未初始化对象,构造函数" << endl;
X *p = new X;
cout << "销毁,析构函数" << endl;
delete p;
cout << "添加到容器,拷贝构造函数" << endl;
vector<X> vx;
vx.push_back(x);
cout << "拷贝初始化,拷贝构造函数" << endl;
X y = x;
cout << "赋值,拷贝赋值运算符" << endl;
y = x;
cout << "函数执行完毕,销毁x, y和vx中的元素" << endl;
return 0;
}