第12章クラスと動的なメモリ割り当て
12.1動的メモリとクラス
12.1.1レビュー例と静的クラスメンバー
文がメモリを割り当てる方法を説明しますが、メモリを割り当てていないので1は、クラス宣言にトラバースに静的メンバ変数を初期化することはできません。静的クラスメンバーのクラス宣言の外の別々のステートメントを使用して初期化することができますが。静的メンバは、整数または列挙型のconstがある場合しかし、あなたはクラス宣言で初期化することができます。
2、新しいコンストラクタでメモリを割り当てるために使用されるとき、あなたは、空きメモリに対応するデストラクタを削除する必要があります。新しい新しい[]メモリを割り当てる(括弧を含む)場合は、[](ブラケットなど)を削除し、空きメモリを使用します。
図3に示すように、次のコードように注意:
StringBadセーラー=スポーツ;に相当する:
; StringBadセーラー= StringBad(スポーツ)は、以下のようにこのように、対応するコンストラクタプロトタイプがなければならない
。StringBad(StringBadのconst&)を
別を初期化するためにオブジェクトを使用する場合、ありますオブジェクトは、コンパイラが自動的にコンストラクタを生成しますとき(それはオブジェクトのコピーを作成するため、コピーコンストラクタと呼ばれます)。
12.1.2暗黙のメンバ関数
1、C ++は自動的にこれらのメンバ関数を提供します。
リットルのデフォルトコンストラクタ、コンストラクタを定義していない場合。
リットルのコピーコンストラクタ、定義されていない場合。
定義されていない場合lは、オペレータをコピーします。
リットルのデフォルトのデストラクタ、定義されていない場合。
定義されていない場合リットルアドレス演算子、
より正確には、コンパイラは最後の4つの定義された関数を生成します。オブジェクトが他のオブジェクトに割り当てられている場合、コンパイラは、代入演算子の定義を提供します。
2、コピーコンストラクタ
1、コピーコンストラクタが作成された新しいオブジェクトにオブジェクトをコピーするために使用されます。それは、代わりに通常のレプリケーション・プロセスのプロセスを、初期化するために使用されています。プロトタイプは以下の通りである:
CLASS_NAME(CLASS_NAMEのCONST&)。
コピーコンストラクタを呼び出すようにするとき2は、以下の4つのステートメントが呼び出されます。
L StringBad同上(モットー)。
LはStringBad METOOのモットーを=。
LはまたStringBad = StringBad(モットー)。
L * StringBad pStringBad =新しいStringBad(キーワード);
二つの中間ステートメントはまた、コピーコンストラクタを使用する意思がある、また、コピー機能構成ステーションとMETOOを作成するために直接使用することができる、請求一時オブジェクトを作成し、オブジェクトはまた、一時的なMETOOの内容に割り当てられています。モットーを使用して、最後の文は、匿名オブジェクトを初期化し、ポインタをpstringに新しいオブジェクトのアドレスを割り当てます。
プログラムは、オブジェクトのコピーを生成するたびに、コンパイラはコピーコンストラクタを使用します。具体的には、伝達関数または関数が値オブジェクトがオブジェクトを返す場合、コピーコンストラクタを使用します。
3、レプリケーション構成局機能
lは、デフォルトのコピーコンストラクタは、(複製のメンバーが浅いコピーとなっている)非静的メンバのコピーとなり、会員の値をコピーします。
デフォルト値でコピーされることをリットルに注意してください。値が割り当てられた価値による2つのポインタは、同じメモリ位置を指している場合、この手段。だから、メモリロケーションが解放されないことをメモしておいてください、その後、リコールの一つでした。回避するには、この問題を解決するために、明示的なストップ機能のコピーの設定を使用することができます。レプリケーションの深さの目的を達成することができます。
図4に示すように、代入演算子
L C ++クラスのオブジェクトの割り当てを可能にし、これは赤色で自動クラス代入演算子によって達成されます。このプロトタイプ演算子は、以下:
CLASS_NAME&CLASS_NAME ::演算子=(CONST&CLASS_NAME);
それは受け入れ、クラスオブジェクトへのポインタを返します。
Lは、オーバーロード代入演算子を使用して、別のオブジェクトへの既存のオブジェクトに割り当てられた場合。
L暗黙的代入演算子はまた、コピーのメンバーで実装しています。メンバーは、クラスオブジェクト自体である場合、プログラムはメンバーをコピーするには、この代入演算子のためのクラス定義を使用しますが、静的データメンバには影響を与えません。
Lは、同じアドレスに異なるオブジェクトポイントにつながる可能性があり、浅いコピーです。避けるために、私たちは、代入演算子が定義されて使用する必要があります。複製の深さの目的。
1、newとdeleteの話
コンストラクタによって新しいアドレスでは、デストラクタはにより削除します
2、次の場合にデストラクタ呼び出されます
オブジェクトは動的変数である場合に実行されたときLは、対象ブロックの定義が完了したとき、そのオブジェクトのデストラクタを呼び出します。
Lは、オブジェクトが、静的変数(外部、静的、静的、または外部の名前空間から)である場合、プログラムの終了時にデストラクタオブジェクトを呼び出します。
Lオブジェクトが新しいを使用して作成された場合は、明示的に削除使用している場合にのみオブジェクトが削除され、そのデストラクタが呼び出されます。