C++学習ノートday 42---C++98-コンストラクション関数、オブジェクトの作成と破棄、コンストラクション関数について

2968 ワード

変数を定義するように、プログラムでオブジェクト/オブジェクト配列を定義できます.newでオブジェクトの作成を完了できます.newとmallocの主な違いは、newがオブジェクトを作成するときに、そのコンストラクション関数を呼び出してオブジェクトを初期化できることであり、mallocは空間を申請するだけである.コンストラクション関数:コンストラクション関数パラメータのリスト:デフォルトパラメータ付きデフォルトコンストラクション関数:コンパイラは、コンストラクション関数が定義されていないクラスごとにデフォルトコンストラクション関数を定義します.タイプ変換コンストラクション関数:このコンストラクション関数のパラメータリストには、コンパイラが最適化された場合、コンストラクション関数を直接利用してオブジェクトを作成する値が1つしかありません.コンパイラが最適化されていない場合は、一時オブジェクトを作成し、コピーコンストラクタで初期化します.コピーコンストラクション関数:コンパイラは、コピーコンストラクション関数を定義していないクラスごとに、デフォルトのコピーコンストラクション関数を定義します.機能がよく、ユーザーが自分で定義する必要はありません.しかし、特別な状況がある(ここでは議論しない).コピーコンストラクション関数が発生するタイミングに注意してください.1、あるオブジェクトを利用して別のオブジェクトを初期化する.2、関数の直接形式のパラメータは対象の方式で伝達します;3、関数の戻り値はオブジェクトの形式である
十三、クラスの定義とインスタンス化1、クラスを定義する文法一般形式class/structクラス名:継承方式ベースクラス…{アクセス制御変数子:クラス名(パラメータテーブル):初期化テーブル{//関数体}//コンストラクション関数~クラス名(void){関数体}//コンストラクション関数戻りタイプ関数名(パラメータテーブル){関数体}//メンバー関数データ型変数名;//メンバー変数};
2、アクセス制御制限子:影響クラスのメンバーのアクセス先1)public:パブリックメンバー、任意の場所でアクセス可能2)protected:保護メンバー3)private:プライベートclassデフォルトプライベート、structデフォルトパブリック
//クラス内のプライベートメンバーは、クラスの外で直接アクセスすることはできませんが、間接アクセスのために公有の関数を提供することができます.この関数では、不正なデータに対して制御ビジネスの合理性を限定することができます.
3、コンストラクション関数(Constructor)構文:classクラス名{クラス名(コンストラクションパラメータテーブル){オブジェクトの初期化、すなわちメンバー変数の初期化を担当する}//コンストラクション関数}1)関数名とクラス名が同じで,戻りタイプがない2)オブジェクトを作成する場合,自動呼び出し,通常のメンバー関数のように直接オブジェクト呼び出しを行うことはできない.
4、マルチファイルプログラミングクラスの宣言と定義はそれぞれ異なるファイルに置く
5、オブジェクトの作成と破棄
1)スタック領域に単一オブジェクトクラス名オブジェクトを作成する(実パラメータテーブルを構築する).クラス名オブジェクト=クラス名(実パラメータテーブルを作成);注:両方式は等価
2)スタック領域にオブジェクト配列クラス名オブジェクト配列を作成する[要素個数]={クラス名(),...,...};
3)スタック領域での単一オブジェクトの作成/破棄:クラス名*オブジェクトポインタ=newクラス名(実パラメータテーブルを構築);破棄:deleteオブジェクトポインタ;
4)スタック領域での複数のオブジェクトの作成/破棄:クラス名*オブジェクトポインタ=newクラス名[要素数]{タイプ(実パラメータテーブルを構築),...,...}破棄:delete[]オブジェクトポインタ;
14、コンストラクション関数および初期化テーブル1のコンストラクション関数は、リロードしてもよいし、デフォルトパラメータeg:class Studio{public:Studio(const string&name,int age,int no){...}Studio(const string&name="who?"{…} }
2デフォルト(パラメトリックなし)コンストラクタ1)クラスにコンストラクタが定義されていない場合、コンパイラはクラスにデフォルトのパラメトリックなしコンストラクタを提供します.->基本タイプのメンバー変数を初期化しない->クラスタイプのメンバー変数に対して、対応するクラスの非パラメトリック構造関数を自動的に呼び出して初期化します2)クラスが構造関数を定義している場合、パラメータがあるかどうかにかかわらず、コンパイラはパラメータのない構造関数を提供しません.
3タイプ変換(単一パラメータ)コンストラクション関数explicit classターゲットタイプ{ターゲットタイプ(ソースタイプ){......}}ソース・タイプからターゲット・タイプへの暗黙的な変換を実現できます注意:explicit修飾構造関数を使用して、この変換を明示的に行わなければならないことを強制できます.
4コピー(コピー)コンストラクタ1)構文:存在するオブジェクトで同じタイプのコピーオブジェクトを構築すると、クラスのコピーコンストラクタclassクラス名{クラス名(constクラス名&...){...}}が呼び出されます.class A{}; A a1; A a2(a1);//コピーコンストラクタの呼び出し
2)クラスにコピーコンストラクタが定義されていない場合、コンパイラはクラスにデフォルトのコピーコンストラクタを提供します.class A{};//デフォルトパラメータなし、デフォルトコピーclass A{A(int){};//デフォルトコピーclass A{A(int){}A(A){}//class A{A(A){}//なし
-->          ,     
-->         (     ),                。
 :     ,             ,                      。

3)コンストラクション関数呼び出しタイミングのコピー->同じタイプのオブジェクトとして定義されたオブジェクトを使用するコンストラクションパラメータ->オブジェクトとして関数にパラメータを渡す->関数からオブジェクトを返す(コンパイラによって最適化される場合がある)最適化オプションの除去(-fno-elide-constructors)