《C++ Primer》13.1.3节练习
练习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节练习相关推荐
- C++primer 13.1.6节练习
练习13.18 1 #include <iostream> 2 #include <string> 3 #include <memory> 4 5 using na ...
- C++primer 13.6.2节练习
练习13.49 13.50 1 #include <iostream> 2 #include <string> 3 #include <utility> 4 #in ...
- 《C++ Primer》13.1.2节练习
练习13.6: 拷贝赋值运算符本身是一个重载的赋值运算符,定义为类的成员函数,左侧运算对象绑定到隐含的this参数,而右侧运算对象是所属类类型的,作为函数的参数,函数返回指向其左侧运算对象的引用. 当 ...
- 《C++ Primer》13.1.1节练习
练习13.1: 如果构造函数的第一个参数是自身类类型的引用,且所有其他参数(如果有的话)都有默认值,则此构造函数是拷贝构造函数.拷贝构造函数在以下几种情况下会被使用: ●拷贝初始化(用=定义变量). ...
- 《C++ Primer》13.1.6节练习(部分)
练习13.18: #include <iostream> #include <string> using namespace std;class Employee {priva ...
- 《C++ Primer》13.1.4节练习
练习13.14: 这是一个典型的应该定义拷贝控制成员的场合.如果不定义拷贝构造函数和拷贝赋值运算符,依赖合成的版本,则在拷贝构造和赋值时,会简单复制数据成员.对本问题来说,就是将序号简单复制给新对象. ...
- 【C++ Primer | 13】课后习题答案
文章目录 13.1.4节目练习 13.2节练习 13.2.2练习 13.1.4节目练习 练习13.14 #include <iostream> using namespace std;cl ...
- C++primer 9.2.1节练习
练习9.3 迭代器begin和end必须指向相同的容器,end可以与begin指向相同的位置,但不能指向begin之前的位置: 练习9.4 1 #include <iostream> 2 ...
- C++primer 10.2.1节练习
练习10.3 1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include <s ...
最新文章
- 建议收藏,清华高材生准备的90条Python程序建议
- 【开发环境】安装 Visual Studio Community 2013 开发环境 ( 下载 Visual Studio Community 2013 with Update 5 版本的安装包 )
- Symfony 4.3 发布,带来搜索引擎自动保护
- linux ubuntu安装教程6,64位Ubuntu下安装IE6步骤
- 文件服务器冷热数据划分,游戏服务器冷热数据分离方案
- asp.net链接mysql数据库------------【个人收集】
- 2017-12-07 socket 读取问题
- java二次开发浏览器内核_深入理解基于Selenium的二次开发
- 最小公倍数的求解原理和证明
- java quartz xml_java 使用quartz 定时xml 配置 与注解 以及注意事项
- ubunut14.04修改时区,查看版本信息
- DW Basic Knowledge1
- ulipad双击打不开 解决
- FLASH透明背景代码大全
- 《生与死》(瓦特·兰德)
- 搭建 Python 开发环境
- APP 分析 随手记
- 建筑施工复习资料-立杆基础
- 去哪儿12306候补购票怎么用?
- android5.0模拟器pc版,逍遥安卓独家发布支持5.0安卓系统电脑模拟器