C++オブジェクト向けノート:構築、構造関数、メンバー関数
4303 ワード
コンストラクション関数:クラス内のデータ・メンバーを初期化する
デフォルトコンストラクタは自動的に生成されます(パラメータは空です).ただし、パラメータ付きコンストラクタを手動で定義すると、デフォルトコンストラクタが自動的に上書きされます.デフォルトコンストラクタを呼び出してインスタンス化する必要がある場合は、パラメータなしのコンストラクタを手動で定義する必要があります.
初期化リスト:初期化リストの定義:User():sId(0001)、sSex(1)など、クラスデータメンバーを初期化リストで初期化できます.
ベースクラスを継承するときに派生クラスでベースクラスのコンストラクション関数を呼び出し、ベースクラスを初期化します.実際には初期化リストです.
コンストラクション関数は、クラス内でのみ宣言でき、クラス外で定義され、宣言時にリストを初期化する必要はなく、定義時に初期化リストを与える必要があります(ある場合).
リストを初期化するには、次の2つのケースがあります.データメンバーに定数メンバー:const int Id; データメンバーにはサブオブジェクトがあり、クラスには別のクラスオブジェクト:Groupグループp 1;
コンストラクション関数の実行順序は次のとおりです.割り当てメモリ 初期化メンバーリスト 実行コンストラクタ 定数メンバーはコンストラクション関数に配置できません.定数メンバー宣言後は変更できません.初期化リストにのみ配置できます.
サブオブジェクト:クラスオブジェクトを定義するには、まずメモリを割り当てる必要があります.別のクラスオブジェクトが含まれている場合は、メモリを割り当てる必要があります.そのため、別のクラスオブジェクトの初期化はコンストラクション関数よりも先に実行されます.
クラスのデータメンバーとメンバー関数は別々に格納され、データメンバーはスタック領域を格納し、メンバー関数はコード領域に格納され、メンバー関数はthisポインタで自身のオブジェクトにアクセスします.
静的メンバー:
静的メンバーは静的グローバル領域に格納され、クラスとは実際にはあまり関係ありません.静的メンバーの生存期間はプログラム全体の実行期間であり、プロセスが終了してから解放されます.
静的メンバーは、コンストラクション関数で初期化されたクラスの体外定義または初期化が必要です.
静的および非静的相互アクセス:
テストにより、コンストラクション関数は静的メンバーを初期化することもできます.もちろん、他のメンバー関数も静的メンバーに操作することができます.
しかし、静的メンバー関数が非静的メンバーにアクセスするには、特定のクラスオブジェクトを静的メンバー関数に渡し、そのクラスオブジェクトを介して非静的メンバーにアクセスする特殊な処理が必要です.
常メンバー関数:メンバー関数がconstで修飾されている場合、内部メンバーの変更は許可されません.内部thisポインタにconst修飾を加えたものに相当します.this->id=...値を変更します.
構造関数:構造関数の役割は、オブジェクトを削除することではなく、オブジェクトが使用するメモリ領域を取り消す前にクリーンアップを行います.
関数体が空の構造関数が自動的に生成されます.
用途:内部ポインタがある場合は、構造関数を使用してメモリの漏洩を防止します.
User userなどの一般的なオブジェクトの場合.ドメインがアクティブになると自動的に構造関数が実行されます
ただし、動的に割り当てられたオブジェクトの場合:User user=new user;役割ドメインが出ても、構造関数は自動的に実行されず、構造関数を呼び出すにはdelete userを手動で行う必要があります.
staticローカルオブジェクトは、関数呼び出しの終了時に解放されず、構造関数も呼び出されません.staticオブジェクト構造関数はmain関数の終了またはexit文の実行時にのみ呼び出されます.
構造関数は同様にクラス体外で定義することができ、関数はクラス体内で宣言される.
構造関数の実行順序:
同じタイプのオブジェクトに対して、先に構築された後析、後に構築された先析.
理由:オブジェクトはスタックに存在するため、先に後に出ます.
コンストラクション関数:オブジェクトの作成時にコンストラクション関数を自動的に実行します.
CMyClass myObject;//自動実行コンストラクタ
パラメトリックコンストラクション関数:
CMyClass myObject(1);//自動実行コンストラクタ
1つのコンストラクション関数では、別のコンストラクション関数を手動で呼び出すこともできますが、呼び出されたコンストラクション関数宣言時に初期化パラメータリストがある場合、パラメータ初期化リストは実行されません.
パラメータ初期化リストは、システムが自動的に呼び出された場合にのみ実行されます.
前述のように、CMyClass(int i)でMyClass()が呼び出され、初期化リストiNo(0)は実行されない.
コンストラクション関数とコンストラクション関数を呼び出す順序:1、グローバルオブジェクト:コンストラクション関数はファイル内のすべての関数が実行される前に呼び出され、main関数が実行されたかexitが呼び出されたときにコンストラクション関数2、静的ローカルが実行されます:プログラムでこの静的ローカルオブジェクトが存在する関数を最初に呼び出すときにコンストラクション関数が1回呼び出され、呼び出しが終了した後は解放されません.main関数実行完了またはexit呼び出し時に構造関数3、ローカル自動オブジェクトを実行する:オブジェクトの作成時にその構造関数を呼び出し、その関数実行完了オブジェクトが解放されたときにその構造関数を呼び出す
デフォルトコンストラクタは自動的に生成されます(パラメータは空です).ただし、パラメータ付きコンストラクタを手動で定義すると、デフォルトコンストラクタが自動的に上書きされます.デフォルトコンストラクタを呼び出してインスタンス化する必要がある場合は、パラメータなしのコンストラクタを手動で定義する必要があります.
初期化リスト:初期化リストの定義:User():sId(0001)、sSex(1)など、クラスデータメンバーを初期化リストで初期化できます.
ベースクラスを継承するときに派生クラスでベースクラスのコンストラクション関数を呼び出し、ベースクラスを初期化します.実際には初期化リストです.
コンストラクション関数は、クラス内でのみ宣言でき、クラス外で定義され、宣言時にリストを初期化する必要はなく、定義時に初期化リストを与える必要があります(ある場合).
リストを初期化するには、次の2つのケースがあります.
コンストラクション関数の実行順序は次のとおりです.
サブオブジェクト:クラスオブジェクトを定義するには、まずメモリを割り当てる必要があります.別のクラスオブジェクトが含まれている場合は、メモリを割り当てる必要があります.そのため、別のクラスオブジェクトの初期化はコンストラクション関数よりも先に実行されます.
クラスのデータメンバーとメンバー関数は別々に格納され、データメンバーはスタック領域を格納し、メンバー関数はコード領域に格納され、メンバー関数はthisポインタで自身のオブジェクトにアクセスします.
静的メンバー:
静的メンバーは静的グローバル領域に格納され、クラスとは実際にはあまり関係ありません.静的メンバーの生存期間はプログラム全体の実行期間であり、プロセスが終了してから解放されます.
静的メンバーは、コンストラクション関数で初期化されたクラスの体外定義または初期化が必要です.
静的および非静的相互アクセス:
テストにより、コンストラクション関数は静的メンバーを初期化することもできます.もちろん、他のメンバー関数も静的メンバーに操作することができます.
しかし、静的メンバー関数が非静的メンバーにアクセスするには、特定のクラスオブジェクトを静的メンバー関数に渡し、そのクラスオブジェクトを介して非静的メンバーにアクセスする特殊な処理が必要です.
常メンバー関数:メンバー関数がconstで修飾されている場合、内部メンバーの変更は許可されません.内部thisポインタにconst修飾を加えたものに相当します.this->id=...値を変更します.
構造関数:構造関数の役割は、オブジェクトを削除することではなく、オブジェクトが使用するメモリ領域を取り消す前にクリーンアップを行います.
関数体が空の構造関数が自動的に生成されます.
用途:内部ポインタがある場合は、構造関数を使用してメモリの漏洩を防止します.
User userなどの一般的なオブジェクトの場合.ドメインがアクティブになると自動的に構造関数が実行されます
ただし、動的に割り当てられたオブジェクトの場合:User user=new user;役割ドメインが出ても、構造関数は自動的に実行されず、構造関数を呼び出すにはdelete userを手動で行う必要があります.
staticローカルオブジェクトは、関数呼び出しの終了時に解放されず、構造関数も呼び出されません.staticオブジェクト構造関数はmain関数の終了またはexit文の実行時にのみ呼び出されます.
構造関数は同様にクラス体外で定義することができ、関数はクラス体内で宣言される.
構造関数の実行順序:
同じタイプのオブジェクトに対して、先に構築された後析、後に構築された先析.
理由:オブジェクトはスタックに存在するため、先に後に出ます.
1 class CMyClass
2 {
3 public:
4 CMyClass():iNo(0)
5 {}
6 CMyClass(int i):iNo(i)
7 {
8 this->iId = i;
9 CMyClass();
10 }
11 public:
12 int iId;
13 const int iNo;
14 };
コンストラクション関数:オブジェクトの作成時にコンストラクション関数を自動的に実行します.
CMyClass myObject;//自動実行コンストラクタ
パラメトリックコンストラクション関数:
CMyClass myObject(1);//自動実行コンストラクタ
1つのコンストラクション関数では、別のコンストラクション関数を手動で呼び出すこともできますが、呼び出されたコンストラクション関数宣言時に初期化パラメータリストがある場合、パラメータ初期化リストは実行されません.
パラメータ初期化リストは、システムが自動的に呼び出された場合にのみ実行されます.
前述のように、CMyClass(int i)でMyClass()が呼び出され、初期化リストiNo(0)は実行されない.
コンストラクション関数とコンストラクション関数を呼び出す順序:1、グローバルオブジェクト:コンストラクション関数はファイル内のすべての関数が実行される前に呼び出され、main関数が実行されたかexitが呼び出されたときにコンストラクション関数2、静的ローカルが実行されます:プログラムでこの静的ローカルオブジェクトが存在する関数を最初に呼び出すときにコンストラクション関数が1回呼び出され、呼び出しが終了した後は解放されません.main関数実行完了またはexit呼び出し時に構造関数3、ローカル自動オブジェクトを実行する:オブジェクトの作成時にその構造関数を呼び出し、その関数実行完了オブジェクトが解放されたときにその構造関数を呼び出す