前回、オブジェクトの初期化で右辺値を指定し、ムーブコンストラクタが実行された。
オブジェクトの代入で右辺値を指定された場合は、ムーブ代入演算子が実行される。
右辺値参照・ムーブセマンティクス - cpprefjp C++日本語リファレンス
profile.hで、
profile.cppでは、
メンバが残っていたら破棄して、ポインタを挿げ替えて、渡された方にはnullptrをセット。
main.cppでは、
std::move経由で代入。
$ vi main.cpp $ g++ -o main main.cpp profile.cpp -std=c++11 $ ./main constructor set_profile get_name obj1.get_name() = Taro get_age obj1.get_age() = 20 get_address obj1.get_address() = Tokyo copy_constructor get_name obj2.get_name() = Taro get_age obj2.get_age() = 20 get_address obj2.get_address() = Tokyo constructor set_profile get_name obj3.get_name() = Jiro get_age obj3.get_age() = 18 get_address obj3.get_address() = Osaka set_profile copy_assignment_operator get_name obj3.get_name() = Taro get_age obj3.get_age() = 20 get_address obj3.get_address() = Tokyo constructor set_profile get_name obj4.get_name() = Saburo get_age obj4.get_age() = 16 get_address obj4.get_address() = Nagoya move_assignment_operator get_name obj4.get_name() = Taro get_age obj4.get_age() = 20 get_address obj4.get_address() = Tokyo before delete [] name_ = 0x1d4a0f0 before age_ = 20 before delete [] address_ = 0x1d4a110 destructor name_ = nullptr age_ = 0 address_ = nullptr destructor before delete [] name_ = 0x1d4a070 before age_ = 20 before delete [] address_ = 0x1d4a090 destructor before delete [] name_ = 0x1d4a030 before age_ = 20 before delete [] address_ = 0x1d4a050 destructor $
こうなる。