练习13.9:
析构函数完成与构造函数相反的工作:释放对象使用的资源,销毁非静态数据成员。从语法上看,它是类的一个成员函数,名字是波浪号接类名,没有返回值,也不接受参数。
当一个类没有定义析构函数时,编译器会为它合成析构函数。
合成的析构函数体为空,但这并不意味着它什么也不做,当空函数体执行完后,非静态数据成员会被逐个销毁。也就是说,成员是在析构函数体之后隐含的析构阶段中进行销毁的。

练习13.10:

这两个类都没有定义析构函数,因此编译器会为它们合成析构函数。
对StrBlob,合成析构函数的空函数体执行完毕后,会进行隐含的析构阶段,销毁非静态数据成员data。这会调用shared_ptr的析构函数,将引用计数减1,引用计数变为0,会销毁共享的vector对象。
对StrBlobPtr,合成析构函数在隐含的析构阶段会销毁数据成员wptr和curr,销毁wptr会调用weak_ptr的析构函数,引用计数不变,而curr是内置类型,销毁它不会有特殊动作。

练习13.11:

~HasPtr()
{delete ps;
}

练习13.12:
这段代码中会发生三次析构函数调用
1.函数结束时,局部变量item1的生命期结束,被销毁,Sales_data的析构函数被调用。
2.类似的,item2在函数结束时被销毁,Sales_data的析构函数被调用。
3.函数结束时,参数accum的生命期结束,被销毁,Sales_data的析构函数被调用。
在函数结束时,trans的生命期也结束了,但它是Sales_data的指针,并不是它指向的Sales_data对象的生命期结束(只有delete指针时,指向的动态对象的生命期才结束),所以不会引起析构函数的调用。

练习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 &rhs) {cout << "拷贝赋值运算符 = (const X&)" << endl;return *this;}~X() {cout << "析构函数~X()" << endl;}
};void f1(X x) {}void f2(X &x) {}int main() {cout << "局部变量:" << endl;X x;cout << endl;cout << "非引用参数传递:" << endl;f1(x);cout << endl;cout << "引用参数传递:" << endl;f2(x);cout << endl;cout << "动态分配:" << endl;X *px = new X;cout << endl;cout << "添加到容器中:" << endl;vector<X>vx;vx.push_back(x);cout << endl;cout << "释放动态分配对象:" << endl;delete px;cout << endl;cout << "间接初始化和赋值:" << endl;X y = x;y = x;cout << endl;cout << "程序结束:" << endl;return 0;
}


程序结束时有三次析构函数的调用,分别对应x、y和vx的第一个元素。

《C++ Primer》13.1.3节练习相关推荐

  1. C++primer 13.1.6节练习

    练习13.18 1 #include <iostream> 2 #include <string> 3 #include <memory> 4 5 using na ...

  2. C++primer 13.6.2节练习

    练习13.49 13.50 1 #include <iostream> 2 #include <string> 3 #include <utility> 4 #in ...

  3. 《C++ Primer》13.1.2节练习

    练习13.6: 拷贝赋值运算符本身是一个重载的赋值运算符,定义为类的成员函数,左侧运算对象绑定到隐含的this参数,而右侧运算对象是所属类类型的,作为函数的参数,函数返回指向其左侧运算对象的引用. 当 ...

  4. 《C++ Primer》13.1.1节练习

    练习13.1: 如果构造函数的第一个参数是自身类类型的引用,且所有其他参数(如果有的话)都有默认值,则此构造函数是拷贝构造函数.拷贝构造函数在以下几种情况下会被使用: ●拷贝初始化(用=定义变量). ...

  5. 《C++ Primer》13.1.6节练习(部分)

    练习13.18: #include <iostream> #include <string> using namespace std;class Employee {priva ...

  6. 《C++ Primer》13.1.4节练习

    练习13.14: 这是一个典型的应该定义拷贝控制成员的场合.如果不定义拷贝构造函数和拷贝赋值运算符,依赖合成的版本,则在拷贝构造和赋值时,会简单复制数据成员.对本问题来说,就是将序号简单复制给新对象. ...

  7. 【C++ Primer | 13】课后习题答案

    文章目录 13.1.4节目练习 13.2节练习 13.2.2练习 13.1.4节目练习 练习13.14 #include <iostream> using namespace std;cl ...

  8. C++primer 9.2.1节练习

    练习9.3 迭代器begin和end必须指向相同的容器,end可以与begin指向相同的位置,但不能指向begin之前的位置: 练习9.4 1 #include <iostream> 2 ...

  9. C++primer 10.2.1节练习

    练习10.3 1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include <s ...

最新文章

  1. 建议收藏,清华高材生准备的90条Python程序建议
  2. 【开发环境】安装 Visual Studio Community 2013 开发环境 ( 下载 Visual Studio Community 2013 with Update 5 版本的安装包 )
  3. Symfony 4.3 发布,带来搜索引擎自动保护
  4. linux ubuntu安装教程6,64位Ubuntu下安装IE6步骤
  5. 文件服务器冷热数据划分,游戏服务器冷热数据分离方案
  6. asp.net链接mysql数据库------------【个人收集】
  7. 2017-12-07 socket 读取问题
  8. java二次开发浏览器内核_深入理解基于Selenium的二次开发
  9. 最小公倍数的求解原理和证明
  10. java quartz xml_java 使用quartz 定时xml 配置 与注解 以及注意事项
  11. ubunut14.04修改时区,查看版本信息
  12. DW Basic Knowledge1
  13. ulipad双击打不开 解决
  14. FLASH透明背景代码大全
  15. 《生与死》(瓦特·兰德)
  16. 搭建 Python 开发环境
  17. APP 分析 随手记
  18. 建筑施工复习资料-立杆基础
  19. 去哪儿12306候补购票怎么用?
  20. android5.0模拟器pc版,逍遥安卓独家发布支持5.0安卓系统电脑模拟器

热门文章

  1. Apache之三种工作模式和配置性能优化
  2. C和指针之动态内存分配堆、栈、全局区(静态区)、常量区对比总结学习笔记
  3. C语言之获取32字节随机数的字符串
  4. Android之万能适配器Adapter的使用
  5. 【C语言简单说】三:浮点数变量和字符变量(4)
  6. linux磁盘第一个扇区分析,Linux磁盘分区
  7. hfss史密斯图_HFSS仿真工程实例 (微波器件).ppt
  8. DeepMind 的马尔可夫决策过程(MDP)课堂笔记
  9. 杠杆原理的形象演示,你都懂了吗?
  10. 和套套一样,一次性橡胶手套制作现场, 这鬼畜的画风