クラス設計と継承の注意事項

1928 ワード

一、コンパイラが生成したメンバー関数
1、デフォルトコンストラクタ(パラメータがない、またはパラメータにデフォルト値がある)です.派生クラスのメンバー初期化リストに明示的な呼び出しベースクラスのコンストラクタがない場合、コンパイラはベースクラスのデフォルトコンストラクタを呼び出します.コンストラクション関数が定義されている場合、コンパイラはデフォルトコンストラクション関数を定義しません.デフォルトコンストラクション関数が必要な場合は、自分で定義する必要があります.
2、コピーコンストラクタ(コピーコンストラクタ)、コピーコンストラクタが属するクラスのオブジェクトをパラメータとして受け入れる
書式:
classname(const classname& cn);
レプリケーションコンストラクタはいつ使用されますか.
  • 新しいオブジェクトを同類オブジェクト
  • に初期化する.
  • オブジェクトを関数
  • に値で渡す.
  • 関数は、値によってオブジェクト
  • に戻る.
  • コンパイラ生成テンポラリオブジェクト
  • 3、代入演算子
    デフォルトの割り当て演算子は、クラスオブジェクト間の割り当てを処理するために使用されます.割り当てと初期化の区別に注意してください.
  • 賦値:既存のオブジェクトの値を変更する
  • 初期化:新しいオブジェクトを作成する
  • Person p;
    Person p1 = p; //   
    
    Person p2;
    p2 = p; //  

    コンパイラが提供するデフォルトの割当てはメンバー割当てです.メンバーがクラスオブジェクトの場合、デフォルトのメンバー割当ては対応する割当て演算子を呼び出します.
    レプリケーションコンストラクタを明示的に定義する必要がある場合は、同じ理由で付与演算子を明示的に定義する必要があります.
    プロトタイプは次のとおりです.
    classname & cn::operator=(const classname & cn);

    コンパイラは、必要に応じて1つのタイプを別のタイプに割り当てる割り当て演算子を生成しません.
    明示的定義関数、リロード=演算子
    二、一般的なクラス方法と操作
    1、通常、パラメータとしてオブジェクトを使用する関数を記述する場合は、値ではなく参照でオブジェクトを渡す必要があります.このようにする原因は効率を高めることです.パラメータの生成に関連する一時コピー、すなわちレプリケーションコンストラクタを呼び出し、コンストラクタを呼び出して一時コピーを削除します.関数がオブジェクトを変更しない場合は、パラメータをconst参照として宣言します.
    2、もう一つの理由は、継承したベースクラスに虚関数がある場合、派生クラスの関数パラメータがベースクラスオブジェクトの参照である場合、関数を定義する際に派生クラスのオブジェクトを渡すことができるからである.
    3、戻りオブジェクトと戻り参照
    classname test(classname & cn); //    
    classname & test(classname & cn); //       

    注:関数が関数で作成した一時オブジェクトを返す場合は、参照は返さないでください.
    三、公有相続
    公有継承を使用するには、次の要素を考慮します.
    1、何が受け継がれないの?
    コンストラクタ
    2、派生クラスがベースクラスの友元関数を使用する場合、どのように解決しますか?
    2.1強制変換を使用して、派生クラスポインタまたは参照をベースクラスポインタまたは参照に強制変換し、変換後のポインタまたはyy呼び出しを使用します.
    2.2演算子dynamic_の使用cast<>による強制タイプ変換
    3、構造関数、通常は虚であるべきである
    4、派生クラスの場合、保護されたメンバーは共有メンバーと類似しており、外部の場合、保護されたメンバーはプライベートメンバーと類似している.
    派生クラスは、ベースクラスの保護メンバーに直接アクセスできます.