概述
13.1 拷贝构造函数是什么?什么时候使用它?
答:
如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。当使用拷贝初始化时,我们会用到拷贝构造函数。
13.2 解释为什么下面的声明是非法的:
答:
参数类型应该是引用类型。
13.3 当我们拷贝一个StrBlob
时,会发生什么?拷贝一个StrBlobPtr
呢?
答:
当我们拷贝StrBlob
时,会使 shared_ptr
的引用计数加1。当我们拷贝 StrBlobPtr
时,引用计数不会变化。
13.4 假定 Point
是一个类类型,它有一个public
的拷贝构造函数,指出下面程序片段中哪些地方使用了拷贝构造函数:
答:
如上图,共6处
13.5 给定下面的类框架,编写一个拷贝构造函数,拷贝所有成员。你的构造函数应该动态分配一个新的string
,并将对象拷贝到ps
所指向的位置,而不是拷贝ps本身:
答:
13.6 拷贝赋值运算符是什么?什么时候使用它?合成拷贝赋值运算符完成什么工作?什么时候会生成合成拷贝赋值运算符?
答:
拷贝赋值运算符是一个名为 operator=
的函数。当赋值运算发生时就会用到它。合成拷贝赋值运算符可以用来禁止该类型对象的赋值。如果一个类未定义自己的拷贝赋值运算符,编译器会为它生成一个合成拷贝赋值运算符。
13.7 当我们将一个 StrBlob
赋值给另一个 StrBlob
时,会发生什么?赋值 StrBlobPtr
呢?
答:
会发生浅层复制。
13.8 为13.1.1节练习13.5中的 HasPtr
类编写赋值运算符。类似拷贝构造函数,你的赋值运算符应该将对象拷贝到ps
指向的位置。
答:
13.9 析构函数是什么?合成析构函数完成什么工作?什么时候会生成合成析构函数?
答:
析构函数是类的一个成员函数,名字由波浪号接类名构成。它没有返回值,也不接受参数。合成析构函数可被用来阻止该类型的对象被销毁。当一个类未定义自己的析构函数时,编译器会为它生成一个合成析构函数。
13.11 为前面练习中的 HasPtr
类添加一个析构函数。
答:
13.12 在下面的代码片段中会发生几次析构函数调用?
答:
三次,分别是 accum
、item1
和item2
。
13.13 理解拷贝控制成员和构造函数的一个好方法的定义一个简单的类,为该类定义这些成员,每个成员都打印出自己的名字:
给 X
添加拷贝赋值运算符和析构函数,并编写一个程序以不同的方式使用 X
的对象:将它们作为非引用参数传递;动态分配它们;将它们存放于容器中;诸如此类。观察程序的输出,直到你确认理解了什么时候会使用拷贝控制成员,以及为什么会使用它们。当你观察程序输出时,记住编译器可以略过对拷贝构造函数的调用。
答:
13.14 假定 numbered
是一个类,它有一个默认构造函数,能为每个对象生成一个唯一的序号,保存在名为 mysn
的数据成员中。假定 numbered
使用合成的拷贝控制成员,并给定如下函数:
则下面代码输出什么内容?
答:
输出3个完全一样的数。
13.17 分别编写前三题中所描述的 numbered
和 f
,验证你是否正确预测了输出结果。
答:
13.14
13.15
13.16
13.18 定义一个 Employee
类,它包含雇员的姓名和唯一的雇员证号。为这个类定义默认构造函数,以及接受一个表示雇员姓名的 string
的构造函数。每个构造函数应该通过递增一个 static
数据成员来生成一个唯一的证号。
答:
13.19 你的 Employee
类需要定义它自己的拷贝控制成员吗?如果需要,为什么?如果不需要,为什么?实现你认为 Employee
需要的拷贝控制成员。
答:
13.22 假定我们希望 HasPtr
的行为像一个值。即,对于对象所指向的 string
成员,每个对象都有一份自己的拷贝。我们将在下一节介绍拷贝控制成员的定义。但是,你已经学习了定义这些成员所需的所有知识。在继续学习下一节之前,为 HasPtr
编写拷贝构造函数和拷贝赋值运算符。
答:
13.26 对上一题中描述的 strBlob
类,编写你自己的版本。
答:
13.27 定义你自己的使用引用计数版本的 HasPtr
。
答:
13.28 给定下面的类,为其实现一个默认构造函数和必要的拷贝控制成员。
答:
13.30 为你的类值版本的 HasPtr
编写 swap
函数,并测试它。为你的 swap
函数添加一个打印语句,指出函数什么时候执行。
答:
13.31 为你的 HasPtr
类定义一个 <
运算符,并定义一个 HasPtr
的 vector
。为这个 vector
添加一些元素,并对它执行 sort
。注意何时会调用 swap
。
答:
13.34 编写本节所描述的 Message
。
答:
13.39 编写你自己版本的 StrVec
,包括自己版本的 reserve
、capacity
和resize
。
答:
13.40 为你的 StrVec
类添加一个构造函数,它接受一个 initializer_list<string>
参数。
答:
头文件
实现:
13.44 编写标准库 string
类的简化版本,命名为 String
。你的类应该至少有一个默认构造函数和一个接受 C 风格字符串指针参数的构造函数。使用 allocator
为你的 String
类分配所需内存。
答:
13.45 解释左值引用和右值引用的区别?
答:
常规引用被称为左值引用,绑定到右值的引用被称为右值引用。
13.46 什么类型的引用可以绑定到下面的初始化器上?
答:
13.58 编写新版本的 Foo
类,其 sorted
函数中有打印语句,测试这个类,来验证你对前两题的答案是否正确。
答:
最后
以上就是标致寒风为你收集整理的C++Primer(第五版 )第十三章 拷贝控制 章节编程练习答案的全部内容,希望文章能够帮你解决C++Primer(第五版 )第十三章 拷贝控制 章节编程练习答案所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复