第三章:コンストラクション関数,コンストラクション関数と付与操作(Effective C++Second Edition読書ノート)


クラスのコンストラクション関数、コンストラクション関数、付与関数、コピー関数は、日常的な変数操作に隠されることが多いため、特に注意する必要があります.
ポイント:メモリを動的に割り当てる必要があるクラスにコピーコンストラクタと付与オペレータ(条項11)1を宣言するには、独自のバージョンのコピーコンストラクタと付与オペレータ関数を書くか、privateメンバーとして宣言して定義(実装)しません.これにより、誰かが呼び出すことを防止し、コンパイラが生成することも防止されます.
2)ある参照カウントメカニズムを用いて、現在何個のオブジェクトがあるデータ構造を指しているかを追跡する.
条項12:コンストラクション関数に値を付けずに初期化を使用する
コメント:メンバー初期化リストによる初期化は、コンストラクション関数内で値を割り当てるよりも常に合法的です.
条項13:初期化リストのメンバーリストの順序は、クラスで宣言された順序と同じです.
コメント:クラスメンバーは、クラスで宣言された順序で初期化され、メンバー初期化リストにリストされている順序とは関係ありません.
条項14:ベースクラスに虚析構関数があることを確定する
コメント:ダミー構造関数は、最下位の派生クラスの構造関数が最初に呼び出され、各ベースクラスの構造関数が呼び出されます.
ポイント:operator=関数で使用されるいくつかの仕様(条項15,16,17)
1)operator=を*thisの参照に戻す(条項15)
注記:独自の代入演算子を定義する場合は、代入演算子の左側のパラメータの参照を返す必要があります.*this.そうしないと、連続的に値を割り当てることができないか、呼び出し時の暗黙的なタイプ変換ができないか、両方の状況が同時に発生します.2)operator=ですべてのデータ・メンバーに値を付与する(条項16)
注記:クラスに新しいデータ・メンバーを追加する場合も、付与演算子関数の更新を覚えておいてください.継承クラスの付与関数には、呼び出しベースクラスの付与関数が表示される必要があります.3)operator=で自分に付与された値をチェックする場合(条項17)
注記1:割り当て演算子関数体の先頭で自分に割り当てられていることを検出できる場合は、すぐに戻ることができ、多くの作業を節約できます.そうしないと、割り当て操作全体を実現する必要があります.注記2:正確性を保証します.割り当て演算子がオブジェクトのリソースを最初に解放し(古い値を除去)、新しい値に基づいて新しいリソースを割り当てなければならない場合.自分で自分に値を割り当てる場合、古いリソースを解放することは災害的です.新しいリソースを割り当てるときに古いリソースが必要になるからです.注記:operator=関数に追加する処理方法、*thisの判断が一致する場合は、同じインスタンスであることを示し、値を割り当てる必要はありません.
if (*this == rhs)
    return *this;

第一章:CからC++(Effective C++Second Edition読書ノート)へ
第二章:メモリ管理(Effective C++Second Edition読書ノート)
第三章:コンストラクション関数,コンストラクション関数と付与操作(Effective C++Second Edition読書ノート)
第四章類と関数:設計と声明(Effective C++Second Edition読書ノート)
第五章類と関数:実現(Effective C++Second Edition読書ノート)
第六章継承と対象設計(Effective C++Second Edition読書ノート)