ムーブ代入演算子

前回、オブジェクトの初期化で右辺値を指定し、ムーブコンストラクタが実行された。
オブジェクトの代入で右辺値を指定された場合は、ムーブ代入演算子が実行される。

右辺値参照・ムーブセマンティクス - 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
$

こうなる。

Sample/cpp/move_assignment_operator/move_assignment_operator/src/move_assignment_operator at master · bg1bgst333/Sample · GitHub