コピーコンストラクタと代入演算子を自分で宣言・定義する場合の用意
デフォルトのコピーコンストラクタと代入演算子でも殆どの場合は用途を達成できますが、
クラスで動的なメモリ領域を使用している場合は、
ユーザが自分でコピーコンストラクタと代入演算子(operator=)を自分で宣言・定義して
動的に確保されているメモリ領域をユーザ自身がコピーする作業をする必要があります。
ユーザが自分でコピーコンストラクタ、もしくは代入演算子を宣言・定義するばあいは
それぞれのメンバ関数の動作の違いについて気をつける必要があります。
それは代入演算子を使用する場合のみ自分自身を代入されることを考慮して関数を定義する必要があるということです。
コピーコンストラクタであれば必ず
- 宣言時
- インスタンス生成時
に呼ばれることになる為、引数に自分自身を定義することは不可能ですが、
代入演算子の場合においては自分自身を代入するという操作が可能になります(記述としては無意味ですが・・・)。
さてそこで以下にコピーコンストラクタと代入演算子を自分で宣言・定義する場合の記述例を示します。
コピーコンストラクタ
CTest & CTest::CTest(CTest &data) { 静的なメンバ変数のコピー 動的なメンバ変数領域のコピー }
代入演算子
被代入変数のアドレスと代入変数のアドレスを比較し、同一の変数の場合はそのままthisの値をリターンする。
CTest & CTest::operator=(CTest &data) { if ( this != &data ) { 被代入変数のメンバの動的な変数領域を削除 新たに動的なメンバ変数領域を定義 動的なメンバ変数領域へのデータのコピー 静的なメンバ変数のコピー } return *this; }