Effective C++読書ノート(六)
2294 ワード
Effective C++読書ノート(六)
本文はcheng-zhiのオリジナルの文章で、勝手に転載することができて、しかし必ず明確な位置で出典を明記しなければなりません!
構築/分析/付与演算-条項-05
**C++がデフォルトで作成して呼び出す関数について**
C++は、
上の値は、次のデフォルトの実装と同等です.
**注:上記の4つの関数は宣言されただけですが、実際に呼び出された場合にのみ**が作成されます.例:
注意:上記の4つの関数の1つを手動で作成すると、コンパイラはデフォルトの関数を提供しません.たとえば、独自のコンストラクション関数を作成すると、defaultコンストラクションは作成されません.
コンパイラはデフォルトで空のクラスに次の4つの関数を宣言し、実際に呼び出すときに作成します.デフォルトコンストラクタ デフォルト構造関数 デフォルト デフォルトレプリケーション割り当てオペレータ 構築/分析/付与演算-条項-07
マルチステートベースクラスに対して
開発中に次のようなメモリ漏洩の問題が発生する可能性があります.
あなたの派生クラスオブジェクトはベースクラスのポインタから削除されますが、ベースクラスの解析関数は
解決方法:ベースクラスの構造関数を
その後、メモリの漏洩の問題を心配することなく、派生クラスオブジェクトを正常に削除できます.
virtual構造関数の抽象クラスでの使用
抽象クラスは常にベースクラスとして使用されるため,抽象クラスで
抽象クラスを定義したい場合は、抽象クラスに純粋な虚構造関数を宣言し、定義を提供します.
覚えておいてください.派生クラス継承が必要な場合は、 が必要です.抽象クラスで純粋な虚析構造関数を定義するには、 の定義が必要です.
テキストアドレス
本文は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
コンストラクタマルチステートベースクラスに対して
virtual
構造関数を宣言開発中に次のようなメモリ漏洩の問題が発生する可能性があります.
あなたの派生クラスオブジェクトはベースクラスのポインタから削除されますが、ベースクラスの解析関数は
non-virtual
の解析関数で、その結果、あなたのオブジェクトの派生属性成分が削除されず、メモリが漏洩します.class BaseClass
{
public:
// non-virtual
~BaseClass() {}
};
解決方法:ベースクラスの構造関数を
virtual
構造関数に変更します.class BaseClass
{
public:
// virtual
virtual ~BaseClass() {}
};
その後、メモリの漏洩の問題を心配することなく、派生クラスオブジェクトを正常に削除できます.
virtual
構造関数を使用するのはいつですか?class
にvirtual
関数がある場合は、virtual
構造関数があるはずです.virtual
関数を宣言する目的は、派生クラスの生成を許可することです.virtual
関数を使用しないと、上記のメモリリークの問題が発生します.virtual構造関数の抽象クラスでの使用
抽象クラスは常にベースクラスとして使用されるため,抽象クラスで
virtual
の構造関数を定義する必要がある.抽象クラスを定義したい場合は、抽象クラスに純粋な虚構造関数を宣言し、定義を提供します.
class AbstractClass
{
public:
// pure-virtual
virtual ~AbstractClass() = 0;
}
// ,
AbstractClass::~AbstractClass()
{
}
覚えておいてください.
class
構造関数テキストアドレス