デフォルトの事のクラス......
1.クラス6デフォルトのメンバ関数:
クラスには、メンバーが空のクラスと呼ばれるものではない場合。空のクラスは、何もしませんか?、我々は書いていない場合は任意のクラスは、自動的に次の6つの既定のメンバ関数を生成するわけではありません。
クラス日{}。
2.コンストラクタ:
コンストラクタ、同じ名前のクラス名は、オブジェクトの種類は、各データメンバは、適切な初期値を有し、オブジェクトの存続期間中に1回だけ呼び出されることを保証するために、コンパイラによって自動的に呼び出されるクラスを作成します。
コンストラクタを以下の方法により与えられ、パラメータはデフォルト値を与えることができ、コンストラクタを過負荷にすることができます。
クラス日付 { パブリック: 日付(int型年= 2000、int型の月= 1、INT日= 1 ) { _year = 年。 _month = 月。 _day = 日; } プライベート: int型_year。 int型_month; int型_day; }。 int型のmain() { 日D1を、 リターン 0 ; }
名前が構築されるが、コンストラクタは、特別なメンバ関数はそれを注意すべきであるが、コンストラクタは、コンストラクタの主な仕事であることに注意してくださいは、オブジェクトを作成するためのオープンスペースではありませんが、オブジェクトが初期化されます。
:次のような特徴持つ
1、クラス名と関数名と同じ。
2、ノーリターン値。
オブジェクトがインスタンス化されると3は、コンパイラが自動的に対応するコンストラクタを呼び出します。
4、コンストラクタはオーバーロードすることができます。
5、ユーザーが明示的にコンパイラを定義したら、クラスのコンストラクタの明示的な定義は、C ++コンパイラは自動的に、引数なしのデフォルトコンストラクタを生成しません場合は生成されません。
6は、引数なしのコンストラクタと、完全なデフォルトコンストラクタは、デフォルトコンストラクタと呼ばれ、唯一のデフォルトコンストラクタを持つことができます。注:引数なしのコンストラクタ、全体のデフォルトコンストラクタは、我々はコンパイラが生成するデフォルトコンストラクタを書いていない、それはデフォルトのメンバ関数とみなすことができます。
3.デストラクタ:
デストラクタ:デストラクタオブジェクトは完全に破壊されない代わりにコンストラクタ関数、ローカルオブジェクトの破壊は、コンパイラによって行われます。破壊されたときにオブジェクトが自動的にクリーンアップクラスを完了するために、リソースの一部をデストラクタを呼び出します。
デストラクタは、以下の方法によって与えられました:
クラスSeqList { パブリック: SeqList(size_tの容量 = 10 ) { _pdata =(INT *)はmalloc(容量* はsizeof(INT )); _size = 0 ; _capacity = 容量; } 〜SeqList() // デストラクタパラメータなし { IF (_pdata) { フリー(_pdata); // 空き領域 _pdata = nullptr; // ポインタはnullに設定されています _capacity = 0 。 _size = 0 。 } } プライベート: int型 * _pdata。 size_tの_size; size_tの_capacity; }。 int型)(主 { SeqList S1。 リターン 0 ; }
デストラクタは、特別なメンバ関数です。
次のような特徴:
1.デストラクタ名+クラス名〜文字。
2.ないパラメータが値を返しません。
3.唯一のクラスのデストラクタがあります。明示的に定義されていない場合は、システムが自動的にデフォルトのデストラクタを生成します。
人生の物体側には、C ++コンパイラ・システムは自動的にデストラクタを呼び出す4.。
自動的に生成されたコンパイラ5.デストラクタは、いくつかのことをしますか?次のプログラムは、我々はそのデストラクタカスタムタイプのメンバーを呼び出すために、コンパイラはデフォルトのデストラクタを生成し、表示されます。
4.コピーコンストラクタ:
コンストラクタ:単一のパラメータは、パラメータが存在し、クラスタイプ(CONST一般的に使用される修飾された)のオブジェクトへの参照であり、自動的にクラスタイプの既存のオブジェクトと新しいオブジェクトを作成する際に、コンパイラによって呼び出されます。
コピーコンストラクタは、関数のコンストラクタをオーバーロードされ
クラス日付 { パブリック: 日付(int型年= 2000、int型の月= 1、INT日= 1 ) { _year = 年。 _month = 月。 _day = 日; } ボイドプリント() { COUT << _year << " - " << _month << " - " << _day << ENDL。 } 日(のconstD&DATE)// コンストラクタが参照型である必要があり、伝統的な値は無限の再帰をもたらすコピー { _year = d._year; _month = d._month; _day = d._day; } プライベート: INT _year; INT _month; INT _day ; }; int型のmain() { 日D1(2018、1、1 ); 日D2(D1); d1.Print(); d2.Print(); 戻り 0 ; }
コピーコンストラクタは、次のような特徴を持っている特別なメンバ関数、次のとおりです
。1.コンストラクタのコピーコンストラクタのオーバーロード。
2.パラメータのコピーコンストラクタは一つだけと参照パラメータ渡しを使用する必要があり、値で使用することは、再帰呼び出しを無限につながるだろう。
明示的に定義されていない場合に、システムはデフォルトのコピーコンストラクタを生成します。デフォルトのコピーコンストラクタは、メモリコピーがバイト配列により完成されたことで、我々は値のコピーや、そのような浅いコピーのコピーを呼び出して保存されたオブジェクト。
5.過負荷代入演算子:
演算子のオーバーロード
C ++は演算子のオーバーロード導入コードの可読性を高めるために、演算子のオーバーロードは、特殊な関数名の関数であり、また、その戻り値の型、関数名と引数、戻り値の型と引数リスト通常の関数と類似しています。
関数名は次のとおりです。アクセス演算子シンボルは、キーワードオペレータの背後をオーバーライドする必要があります。
プロトタイプ:戻り値の型演算子演算子(パラメータリスト)。
注:
新しい演算子を作成するために他のシンボルに接続することはできません。演算子を@組み込みの演算子の型、例えば、その意味を変更することはできませんため、オーバーロードされた演算子などが列挙型またはクラス型の数を操作する必要があります。ビルトインINT +は、その意味を変更することはできません。
少ないオペレータのメンバ関数は、デフォルトの最初のパラメータとして定義され、このパラメータ、*、::、はsizeofを、持っているオペランドの数よりも見えクラス・パラメータのメンバーとしての機能をオーバーロード:。 ?、上記5つのオペレータは、オーバーロードされないことに注意してください。これは、多くの場合、筆記試験で複数の選択肢の質問に発生します。
代入演算子として与えられ:
クラス日付 { パブリック: 日付(int型年= 2000、int型の月= 1、INT日= 1 ) { _year = 年。 _month = 月。 _day = 日; } ボイドプリント() { COUT << _year << " - " << _month << " - " << _day << ENDL。 } 日(のconstD&DATE)//が参照型である必要があり、伝統的な値は無限の再帰につながる { _year = d._year; _month = d._month; _day = d._day; } //代入演算子オーバーロード DATE&演算子 =(CONST DATE&D)// 連続割当完了する戻り値 { がiF(この!=&D) //が割り当て自分自身かどうかを決定する { _year = ; d._year _month = d._month; _day = d._day。 } } プライベート: int型_year。 int型_month; int型_day; }。 INT メイン() { 日付D1(2018、1、1 )。 日付D2(D1)。 日付D3 = D2; d1.Print(); d2.Print(); システム(「一時停止」)。 リターン 0 ; }
代入演算子は主に4ポイント:
1.パラメータ型
2.戻り値
3.検出自分自身の割り当てかどうか
4.リターン*この
5.クラスが明示的に代入演算子のオーバーロードで定義されていない場合、コンパイラは、値オブジェクトによって完全なバイト順序がコピーで生成されます。
6.デフォルトコピーコンストラクタや問題点をオーバーロード代入演算子:
デフォルトのコピーコンストラクタと代入演算子のオーバーロードは、クラスオブジェクトがリソース管理を持っている場合、リソースはコピーを完了することができない、バイト列の値をコピーすることです。ソリューションは、ディープコピーです。
7. constメンバ関数:
修飾されたクラスのconstメンバ関数
constメンバ関数の呼び出しCONST修飾クラスのメンバー関数には、修飾されたクラスのメンバ関数をCONST、メンバ関数が実際に暗黙的変更され、このポインタは、のクラスメンバ関数の任意のメンバーを示すことができません変更。
空のsetdate(int型の年、int型の月、INT日)のconst { // プロンプト変更不可能コンパイル _yearを= 年; _month = 月; _day = 日; }
constオブジェクトを非constメンバ関数を呼び出すことはできません。
非constオブジェクトはconstメンバ関数を呼び出すことができます。
constメンバ関数は、非constメンバ関数を呼び出すことはできません。
非constメンバ関数はconstメンバ関数を呼び出すことができます。
8.テイクアドレスおよびアドレスのconst演算子のオーバーロード:
どちらのデフォルトは、一般的にメンバ関数を再定義する必要はありません、コンパイラはデフォルトを生成します。これらの演算子は、一般的に、アドレス、唯一の特別な状況、唯一指定されたコンテンツを取得するには、このような希望他人として、過負荷に必要を取ることができ、コンパイラが生成するデフォルトのオーバーロードを使用して、ヘビーデューティーを必要としません。
日付* 演算子&() { 返す これを。 } CONST日* 演算子&()のconst { 戻り これを。 }
演算子のオーバーロード指定されたアドレスを取得するだけでなく、アドレスのconst型演算子のオーバーロードを取得、その後食べている場合。