Effective C++読書ノート(六)

2294 ワード

Effective C++読書ノート(六)
本文はcheng-zhiのオリジナルの文章で、勝手に転載することができて、しかし必ず明確な位置で出典を明記しなければなりません!
構築/分析/付与演算-条項-05
**C++がデフォルトで作成して呼び出す関数について**
C++は、empty classを新規作成し、変更を行わなかった場合、次の4つのpublic inline関数をデフォルトで宣言します.
class Empty
{
public:
  // default     
  Empty() {}
  // default     
  ~Empty() {}
  // default copy     
  Empty(const Empty& rhs) {}
  // default        
  Empty& operator=(const Empty& rhs) {}
};

上の値は、次のデフォルトの実装と同等です.
class Empty
{
};

**注:上記の4つの関数は宣言されただけですが、実際に呼び出された場合にのみ**が作成されます.例:
{
  // e1   default         
  Empty e1;

  //      ,e1   default           
}

{
  // e2   default         
  Empty e2;

  // e1   copy       
  Empty e1(e2);
  // e2               
  e2 = e1;
}

注意:上記の4つの関数の1つを手動で作成すると、コンパイラはデフォルトの関数を提供しません.たとえば、独自のコンストラクション関数を作成すると、defaultコンストラクションは作成されません.
コンパイラはデフォルトで空のクラスに次の4つの関数を宣言し、実際に呼び出すときに作成します.
  • デフォルトコンストラクタ
  • デフォルト構造関数
  • デフォルトcopyコンストラクタ
  • デフォルトレプリケーション割り当てオペレータ
  • 構築/分析/付与演算-条項-07
    マルチステートベースクラスに対してvirtual構造関数を宣言
    開発中に次のようなメモリ漏洩の問題が発生する可能性があります.
    あなたの派生クラスオブジェクトはベースクラスのポインタから削除されますが、ベースクラスの解析関数はnon-virtualの解析関数で、その結果、あなたのオブジェクトの派生属性成分が削除されず、メモリが漏洩します.
    class BaseClass
    {
    public:
      // non-virtual     
      ~BaseClass() {}
    };
    

    解決方法:ベースクラスの構造関数をvirtual構造関数に変更します.
    class BaseClass
    {
    public:
      // virtual     
      virtual ~BaseClass() {}
    };
    

    その後、メモリの漏洩の問題を心配することなく、派生クラスオブジェクトを正常に削除できます.virtual構造関数を使用するのはいつですか?classvirtual関数がある場合は、virtual構造関数があるはずです.virtual関数を宣言する目的は、派生クラスの生成を許可することです.virtual関数を使用しないと、上記のメモリリークの問題が発生します.
    virtual構造関数の抽象クラスでの使用
    抽象クラスは常にベースクラスとして使用されるため,抽象クラスでvirtualの構造関数を定義する必要がある.
    抽象クラスを定義したい場合は、抽象クラスに純粋な虚構造関数を宣言し、定義を提供します.
    class AbstractClass
    {
    public:
      //    pure-virtual     
      virtual ~AbstractClass() = 0;
    }
    
    //                      ,        
    AbstractClass::~AbstractClass()
    {
    }
    

    覚えておいてください.
  • 派生クラス継承が必要な場合は、class構造関数
  • が必要です.
  • 抽象クラスで純粋な虚析構造関数を定義するには、
  • の定義が必要です.
    テキストアドレス