第十三章 13.6.2节练习
2014-09-13 12:06
141 查看
练习13.49
为你的StrVec、String和Message类添加一个移动构造函数和一个移动赋值运算符。
解答:
这里可以参考478页中HasPtr添加移动构造函数和移动赋值运算符的实现。
练习13.50
在你的String类的移动操作中添加打印语句,并重新运行13.6.1节(第473页)的练习13.48中的程序,它使用一个vector<String>,观察什么时候会避免拷贝。
解答:
练习13.51
虽然unique_ptr不能拷贝,但我们在12.1.5节(第418页)中编写了一个clone函数,它以值方式返回一个unique_ptr。解释为什么函数是合法的,以及为什么它能正常工作。
解答:
这里对unique_ptr指针做的操作不是拷贝的操作,而是移动的操作,移动的操作对于unique_ptr来说是合法的,因为并没有拷贝当前指针,让多个指针对其产生共享。
练习13.52
详细解释第478也中的HasPtr对象的赋值发生了什么?特别是,一步一步描述hp,hp2以及HasPtr的赋值运算符中的参数rhs的值发生了什么变化。
解答:
在478页部分内容有比较详细的讲解。
对于HasPtr赋值中rhs发生了什么变化,因为执行的是交换操作,所以rhs的值会被其他值取代。
练习13.53:
略
练习13.54:
如果我们为HasPtr定义了移动赋值运算符,但未改变拷贝并交换运算符会发生什么?编写代码验证你的答案。
解答:
程序应该不会去调用移动赋值运算符,而会继续使用拷贝并交换运算符。
个人觉得的这里将“拷贝并交换运算符”换为“拷贝赋值运算符”可能更容易理解一些,因为在实现中,的确是先拷贝,然后再交换,来完成赋值操作的。
为你的StrVec、String和Message类添加一个移动构造函数和一个移动赋值运算符。
解答:
这里可以参考478页中HasPtr添加移动构造函数和移动赋值运算符的实现。
练习13.50
在你的String类的移动操作中添加打印语句,并重新运行13.6.1节(第473页)的练习13.48中的程序,它使用一个vector<String>,观察什么时候会避免拷贝。
解答:
#include <vector> #include <iostream> #include <string> using namespace std; class String{ public: String() :str(string()){} String(const char* cstr) :str(cstr){} String(const String& ori) : str(ori.str){ cout << "copy constructor function" << endl; } String(String&& ori) throw() : str(ori.str){ cout << "move copy constructor function" << endl; } String &operator=(String &&rhs) throw(){ str = rhs.str; return *this; } string str; }; int main(){ vector<String> test; test.push_back("haha0"); test.push_back("haha1"); test.push_back("haha2"); test.push_back("haha3"); test.push_back("haha4"); }
练习13.51
虽然unique_ptr不能拷贝,但我们在12.1.5节(第418页)中编写了一个clone函数,它以值方式返回一个unique_ptr。解释为什么函数是合法的,以及为什么它能正常工作。
解答:
这里对unique_ptr指针做的操作不是拷贝的操作,而是移动的操作,移动的操作对于unique_ptr来说是合法的,因为并没有拷贝当前指针,让多个指针对其产生共享。
练习13.52
详细解释第478也中的HasPtr对象的赋值发生了什么?特别是,一步一步描述hp,hp2以及HasPtr的赋值运算符中的参数rhs的值发生了什么变化。
解答:
在478页部分内容有比较详细的讲解。
对于HasPtr赋值中rhs发生了什么变化,因为执行的是交换操作,所以rhs的值会被其他值取代。
练习13.53:
略
练习13.54:
如果我们为HasPtr定义了移动赋值运算符,但未改变拷贝并交换运算符会发生什么?编写代码验证你的答案。
解答:
程序应该不会去调用移动赋值运算符,而会继续使用拷贝并交换运算符。
个人觉得的这里将“拷贝并交换运算符”换为“拷贝赋值运算符”可能更容易理解一些,因为在实现中,的确是先拷贝,然后再交换,来完成赋值操作的。
相关文章推荐
- python 核心编程2 第十三章练习
- C ++ Primer Plus 第六版 第十三章编程练习答案
- 第十三章 13.3节练习
- 第十三章 13.6.1节练习
- 《Python核心编程》第二版第405页第十三章练习 续二 -Python核心编程答案-自己做的-
- 第十三章 13.6.3节练习
- 《Python核心编程》第二版第407页第十三章练习 续四 -Python核心编程答案-自己做的-
- 《Erlang 程序设计》练习答案 -- 第十三章 并发程序中的错误
- 《Python核心编程》第二版第407页第十三章练习 续六 -Python核心编程答案-自己做的-
- (一四五)第十三章编程练习
- 现代软件工程 第十三章 【软件测试】 练习与讨论
- 第十三章yum仓库的练习
- 现代软件工程 第十三章 【软件测试】 练习与讨论
- 第十三章 13.1.6节练习 & 13.2节练习
- 第十三章 13.2.2节练习
- C++ Primer Plus第六版 第十三章 编程练习答案
- 第十三章练习
- 王爽《汇编语言》第十三章所有练习解答
- 第十三章编程练习(3)
- 第十三章编程练习(1)