第13章13.6.2節練習

1725 ワード

練習13.49
StrVec、String、Messageクラスに移動構造関数と移動付与演算子を追加します.
回答:
ここでは478ページのHasPtrを参照して、移動構造関数と移動付与演算子の実装を追加することができる.
練習13.50
Stringクラスの移動操作に印刷文を追加し、13.6.1セクション(473ページ)の練習13.48のプログラムを再実行します.vectorを使用して、コピーを避けるタイミングを観察します.
回答:
#include 
#include 
#include 

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 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、hp 2およびHasPtrの付与演算子におけるパラメータrhsの値がどのように変化したかを一歩ずつ説明する.
回答:
478ページの部分には比較的詳細な説明があります.
HasPtr付与でrhsがどのように変化したかは,交換動作を実行しているため,rhsの値は他の値に取って代わられる.
練習13.53:

練習13.54:
HasPtrに移動割付演算子を定義したが、コピーを変更せずに演算子を交換した場合はどうなりますか?コードを作成してあなたの答えを検証します.
回答:
プログラムは、移動付与演算子を呼び出すのではなく、コピーを使用して演算子を交換し続けるはずです.
個人的には、ここで「演算子のコピーと交換」を「コピー付与演算子」に変更すると、実装では、確かにコピーしてから交換して付与操作を完了するので、理解しやすいかもしれません.