C ++クラスのデフォルトの機能

  C ++、クラスで8つのデフォルトの機能:

  1. デフォルトコンストラクタ。
  2. デフォルトのコピーコンストラクタ。
  3. デフォルトのデストラクタ。
  4. 機能をオーバーロードデフォルトの代入演算子。
  5. デフォルトのアドレス・オーバーロードされた演算子関数。
  6. 過負荷演算子デフォルトのアドレス-constの機能。
  7. モバイルデフォルトコンストラクタ(C ++ 11)。
  8. 移動関数をオーバーロードデフォルトの代入演算子(C ++ 11)。

    クラスの宣言は、それが何もしない、ちょうど空で、お使いのコンパイラが自動的にデフォルトコンストラクタは、デフォルトのコピーコンストラクタ、デフォルトの関数とデストラクタをオーバーロードデフォルトの代入演算子を生成します。最初に呼び出され、コンパイラが作成されるだけでこれらの機能には、当然のことながら、いくつかの実装では、デフォルトの関数は何もしないことである生成します。これらすべての機能は、インラインと公開されています。

  私たちは、オブジェクトが設定(シングルモード)または割り当てを表示させたくない、対応する機能は、プライベートとして宣言、または基本クラス、デフォルトの機能の開口部は、それを継承するサブクラスを書くことができます。C ++ 11の新しい識別子のデフォルトと削除、これらのデフォルトの機能を使用するかどうかを制御します。

  デフォルト:デフォルトの関数のような、クラスの既定の動作を使用して同定される:()=デフォルト。

  識別された既定の機能のような、無効になります:削除A()=削除します。

    識別機能が必要とされるか、または基底クラスの仮想関数をオーバーライド;オーバーライド

    最終:識別機能が上書きされてから禁止基底クラスの仮想関数です。

1  クラスA
 2  {
 3。 公共4  
。5      // デフォルトコンストラクタ; 
6      A();
 7  
。8      // デフォルトのコピーコンストラクタ
。9      A(CONST A&);
 10  
。11      // デフォルトデストラクタ
12はA();
 13は、 
14      // デフォルトの代入演算子関数オーバーロード
15      A&演算子 =(CONST A&に);
 16  
。17      // デフォルトオーバーロードアドレス演算子関数
18である      *の演算子();
19  
20      // デフォルトアドレスリロード機能CONST演算子
である21      CONST A * 演算子&()のconst ;
 22は、 
図23にある     // 移動デフォルトコンストラクタ
24      A(&& Aを);
 25  
26である     // モバイルオーバーロードデフォルト代入演算子
27      A&演算子 =(CONST A && );
 28  
29 }。

  以下の機能は、各研究に関して詳細に説明されている、不完全があり、コメントは大歓迎補正されている、あなたの批判は次の順方向無尽蔵の力です!

コンストラクタ(コンストラクタ)

1.効果は、オブジェクトのコンストラクタはヒープ上の新しいオブジェクトを初期化したり、自動的にオブジェクトのコンストラクタを呼び出します、スタック上に一時的なオブジェクトを定義しています。そこに初期化リスト割り当てられたコンストラクタ本体二つの方法で、オブジェクトが(各メンバーのみ初期化リストに一度表示されることができる)、より効率的な初期化される初期化リストは、減少割当は、この方法をお勧めします。次のメンバ変数を初期化しなければなりませんリストを初期化:定数メンバ変数は参照型のメンバ変数無メンバ変数のデフォルトコンストラクタ(クラスオブジェクトのコンストラクタのパラメータリスト、オブジェクトのクラスがあり、デフォルトのコンストラクタのパラメータが存在しない場合は、それは初期化リストを使用していない場合は、パラメータには、引数または完全なデフォルトコンストラクタと呼ばれ、クラスということになるとなし);

クラス名と同じです。2.機能は、仮想ではない、オーバーロードすることができ、戻り値、またしても、ボイドを持っていません。

あなたが明示的に定義されていない場合は3、コンパイラが自動的にデフォルトコンストラクタを生成します、デフォルトコンストラクタは何もしません。

4.デフォルト値(デフォルト全体)デフォルトコンストラクタを持っていると考えられており、付き引数なしのコンストラクターとコンストラクタデフォルトのコンストラクタ一つだけ。

5このポインタ機能は、インビボではなく、初期化リストのために使用することができます。コンストラクタは単にあなたがこれを持つことができるので、関数本体が割り当てで、このオブジェクトがすでに存在して開始する前に、オブジェクトを初期化しているため、クラス内の各メンバ変数が初期化されるため、初期化リストは、不完全なため、オブジェクトの初期化の位置を使用することはできませんされてこれは、リストを初期化するために使用されます。

単一パラメータのコンストラクタ6.は、我々が望んでいない、時々暗黙的な変換は、あなたがこの変換を制限するために、明示的なキーワードを使用する必要があり、C ++クラス型のタイプに対応する変換パラメータをデフォルトになります注意することが表示されます;

7.建設順序:コンストラクタ仮想基底クラス(複数の仮想基本クラスが存在する場合、順番にそれらはむしろメンバーの初期化リスト内の順序よりも、構成を継承しています)。

             非仮想ベースクラスのコンストラクタ関数(順序でそれらはむしろメンバーの初期化リスト内の順序よりも、構成を継承している、複数の非仮想ベースクラスがある場合)、
             メンバオブジェクトコンストラクタ(クラスの複数のメンバーが存在する場合;彼らは、コールではなく、メンバーの初期化リスト内の順序を)宣言された順序でオブジェクト
             このクラスのコンストラクタ。建設プロセスは再帰的です。

第二に、コピーコンストラクタ(コピーコンストラクタ)

1.コピーコンストラクタはオーバーロードされたコンストラクタは、実際にある一般的なコンストラクタのすべての特性を持って、通常のオブジェクトがすでに機能に存在するのデータメンバの値をコピーし、そのような既存のオブジェクトに新しいオブジェクトを作成します。中に新しく作成されたオブジェクトへ。このクラスの別のオブジェクトを初期化するために知られているオブジェクトクラスを使用する場合には、自動的にコピーコンストラクタオブジェクトを呼び出します。

2.同じ関数名、カテゴリ名、最初のパラメータは、オブジェクトへの参照で同一であり、他のパラメータまたは他のパラメータがデフォルト値を持たない、戻り値はクラスオブジェクトへの参照であるが連続的に構成された帰還基準値によって達成することができますすなわち、(B(C))このように類似します。

3.明示的に定義されていない場合は、自動的にデフォルトのコピーコンストラクタを生成します、コンパイラ、順次初期化を完了するために、クラスのデータメンバをコピーしますデフォルトのコピーコンストラクタ。

ディープコピー対4の浅い:割り当てが完了して、デフォルトのコピーコンストラクタはクラスメンバのデータメンバがポインタを持っている場合は、単に新しいを行います、アドレスをコピーし、つまり、「シャローコピー」を作成するようにコンパイラを実行しますポインタを削除し、エラーになります重複削除メンバーのアドレスへのポインタポイント、そのオブジェクトと同じオブジェクトのコピーは、ポインタは、新しいメンバーから外れている場合は、「ディープコピー」です。

第三に、デストラクタ(デストラクタ。)

1.デストラクタの役割は、いくつかのクリーンアップを行うライフサイクルの終わりには、自動的にオブジェクトのデストラクタを呼び出すときにオブジェクトまたはオブジェクトを削除することです。

2.文字を関数名、クラス名に〜ないパラメータ(パラメータタイプは空隙を有していてもよい)、戻り値が存在しない、関数は、仮想(ポインタを介してサブクラスオブジェクトに対してデストラクタベースクラス)をオーバーロードすることができないかもしれ、唯一のデストラクタているので、

明示的に定義されていない場合は3、コンパイラが自動的にデフォルトのデストラクタ関数は何もしません、デフォルトのデストラクタを生成します。

代わりに、シーケンスおよびコンストラクタ:4デストラクタシーケンス。破壊プロセスは再帰的です。

第四に、オーバーロードされた代入演算子機能(コピー代入演算子)

1.それはすでに二つのオブジェクト、別の割り当てに一つのプロセスです。2つのオブジェクト間の割り当ては、自動的にオーバーロード代入演算子関数を呼び出すときには、コピーコンストラクタと異なる新しいオブジェクトにコピーコンストラクタオブジェクトは初期値生成処理を有しています。

2.代入演算子は、パラメータCONSTをオーバーロードし、&必須ではなく、戻り値はクラスオブジェクトへの参照である基準値を返すことによって、連続的な割り当てを達成することができる、すなわち、a = b = cのと同様したがって、戻り値の型は必須ではないが、それがあってもよいですvoidを返し、それが継続的な割り当てを使用することはできません。

関数のオーバーロード3代入演算子は、唯一のクラスメンバー関数として定義することができ、それは静的メンバ関数であること、また友人であることができない、代入演算子オーバーロード機能は、自己の割り当てを回避するために、継承することができません。

4.明示的に定義されていない場合は、コンパイラが自動的にデフォルトの代入演算子オーバーロードされた関数を生成します、デフォルトの代入演算子は、ポインタサスペンションの問題が発生します、浅いコピーデータが1人のメンバーずつ割り当てられ、実現するためにオーバーロード。

第五に、アドレス過負荷演算子(定数)機能

1.過負荷アドレス演算子は引数を取りません。

2.明示的に定義されていない場合は、コンパイラが自動的にデフォルトのリロードアドレス演算子関数を生成します、内部関数は、直接、一般的にデフォルトを使用し、これを返します。

六、移動や重い携帯コンストラクタ関数の代入演算子

1.C ++ 11新しい意味論移動:ターゲット・オブジェクトにソースオブジェクトのすべてのリソースを制御し、オブジェクトは、ケースが破壊され、Bの後に初期化のための新しいオリジナルのオブジェクトに移動することができます。

異なるパラメータとコピーコンストラクタは2移動コンストラクタパラメータのコピーコンストラクタは、左の基準値であるが、初期値は移動コンストラクタ右辺値参照です。

3.一時的なオブジェクトが死ぬしようとしているが、この時間、それをリサイクルする必要があるリソースの内側に、私たちは、モバイル構造を使用することができます。モバイル構造は、パフォーマンスの向上をもたらすために、不必要な重複を減らすことができます。

七、議論

1.なぜコンストラクタは戻り値を持つことができませんか?

  (1).C ++言語は、戻り値のコンストラクタを有していません。

  (2)正しい値を使用せずにコンストラクタとして、戻り値は使用されません。

  (3)ビューの基本的な意味論的点からの戻り値は、オブジェクトを返すべき場合でも構築ので、戻り値の型を指定する気にする必要はありません。

  (4)戻り値の場合、コードは、以下で説明します

クラスA
{
パブリック:
():m_iTest(0){}
(int型I):m_iTest(I){}
プライベート:
int型m_iTest;
}。

  C ++、A = A()に応じて、一時的なオブジェクトが一時オブジェクトに、デフォルトコンストラクタを使用して作成し、初期化され、この時点では、値は0 a.m_iTestであるべきです。今:: A()は値を返し、1(示す成功した構成)を返した場合、C ++を初期化するために使用される1、すなわちそこ引数コンストラクタコールA :: A(INT I)で得られました。 m_iTestは1になります。このように、意味のあいまいさは、すでに非常に複雑なC ++構文、さらに混乱を作り、作成しました。

  なぜなら、コンストラクタの意思決定の特殊な性質のため、なぜノーリターン値理由のコンストラクタを呼び出します。もちろん、上記の議論は、C ++言語に基づいているコンストラクタの規定は、使用上の戻り値は、同じではないかもしれない持っていることができるかどうことを提供します。これは素晴らしい質問です、鶏が先か卵が先かです。要するに、今C ++の文法システムは、設計コンストラクタは戻り値を持つことができれば、C ++言語を通じて達成することがより困難であろう、ということです。

以下のような2.オブジェクトの作成と破棄プロセス?

  Objectコンストラクタ(新しい)プロセス:

  (1)オペレータ新しいアプリケーションメモリによって;
  (2)コンストラクタコールの配置を使用して、新しい;.(単純型は、この手順を無視する)
  (3)は、メモリのポインタを返します。

  新しい、malloc関数の比較:

  (1)故障のリターンNULL、malloc関数、new_handlerハンドラが失敗しない呼び出す.new
  ;(2).newが自動的に配置新しいオブジェクトのコンストラクタ、malloc関数を呼び出すことができない
  (3).new何かの外に; malloc関数をキャストするために必要な、void *型で、バンドタイプである
  (4)C ++演算子.newで、malloc関数は、標準Cライブラリ関数です。

  新しい三つの形式:new演算子、new演算子、新しい配置

  (1).new演算子:上記新しいオペレータが新規である、三つのステップの合計は(メモリのために、コンストラクタは、メモリポインタを返す呼び出し)、アプリケーションメモリオペレータ新しい(new演算子)による工程のために完了するために、何のコンストラクタ呼び出しのために、それは新しい配置によって決定することができます。

  (2)新しい.operator:オーバーロードすることができ、通常のオペレータと同様、オペレータ新しい意志がメモリを適用するために、アプリケーションが失敗したときにコールnew_handlerがスローされていない場合、円形プロセスは、あるnew_handler治療、は常にサイクルアプリケーションメモリ、それは成功するまで。

  (3)新しい.placement:コンストラクタを位置決めするための指定されたメモリ・アドレスに使用されるタイプのオブジェクトのコンストラクタ関数を指定。

  オブジェクトは、(削除)プロセスを破壊します:

  (1)デストラクタ(単純なタイプは、この手順を無視する)を呼び出します。

  (2)リリースメモリ。

  削除し、比較的自由

  (1)自動デストラクタオブジェクトを呼び出す.delete、自由ではない;
  (2).Delete C ++演算子である、遊離C標準ライブラリ関数です。

3.なぜコンストラクタパラメータが渡されたクラス型のオブジェクト参照を使用する必要がありますコピー?

 それが合格した場合、基準位置は、再帰的な参照であるコピーコンストラクタを呼び出してきたことは、スタックオーバーフローを引き起こすことになります。

4.なぜ代入演算子は、自己の割り当てを回避するための機能を過負荷になっていますか?

 (1)効率を向上させます。自己割り当て無意味、自己割り当てた場合、あなたはすぐに*これを返すことができます。

   それは割り当てから、ポインタが含まれている場合(2)、クラスの場合、データメンバを回避しない場合、メモリリークであろう。

 

おすすめ

転載: www.cnblogs.com/yuwanxian/p/10924835.html