次の方法で共有


コンストラクターの宣言に関する規則

コンストラクターはそのクラスと同じ名前になります。 コンストラクターは、オーバーロードされた関数の規則に従っていくつでも宣言できます。 詳細については、「オーバーロード」を参照してください。

class-name  (  argument-declaration-list  )

解説

argument-declaration-list は空の場合もあります。

C++ では、次の表に示す 2 種類の特殊なコンストラクター、既定のコンストラクターとコピー コンストラクターが定義されています。

既定のコンストラクターとコピー コンストラクター

コンストラクションの種類

引数

目的

既定のコンストラクター

引数なしで呼び出すことができます。

クラス型の既定のオブジェクトを構築します。

コピー コンストラクター

同じクラス型への参照の単一の引数を受け取ることができます。

クラス型のオブジェクトをコピーします。

既定のコンストラクターは、引数なしで呼び出すことができます。 ただし、すべての引数に既定値がある場合は、引数リストを含む既定のコンストラクターを宣言できます。 同様に、コピー コンストラクターは、同じクラス型への参照の引数を 1 つ受け入れる必要があります。 以降のすべての引数に既定値がある場合、その他の引数を指定できます。

コンストラクターを指定しないと、コンパイラは既定のコンストラクターを生成しようとします。 コピー コンストラクターを指定しない場合、コンパイラが生成を試みます。 コンパイラによって生成されたこのようなコンストラクターは、パブリック メンバー関数と見なされます。 最初の引数が参照ではなくオブジェクトであるコピー コンストラクターを指定すると、エラーが発生します。

コンパイラによって生成された既定のコンストラクターは、オブジェクトを設定 (前に説明したように、vftable および vbtable を初期化) し、基底クラスとメンバーの既定のコンストラクターを呼び出しますが、それ以外のアクションは実行しません。 基底クラスとメンバーのコンストラクターは、存在していて、アクセスでき、あいまいでない場合にのみ呼び出されます。

コンパイラによって生成されたコピー コンストラクターは、新しいオブジェクトを設定し、コピーするオブジェクトのコンテンツのメンバーごとのコピーを実行します。 基底クラスまたはメンバーのコンストラクターが存在する場合は、それらが呼び出されます。存在しない場合は、ビット単位のコピーが実行されます。

type クラスのすべての基底クラスとメンバー クラスに const 引数を受け入れるコピー コンストラクターがある場合、コンパイラで生成されたコピー コンストラクターは、const type**&** 型の 1 つの引数を受け入れます。 それ以外の場合、コンパイラによって生成されたコピー コンストラクターは type**&** 型の引数を 1 つ受け入れます。

コンストラクターを使用して、const または volatile オブジェクトを初期化できますが、コンストラクター自体を const または volatile として宣言することはできません。 コンストラクターに許可される唯一のストレージ クラスは、inline です。__declspec キーワードを含む、その他のストレージ クラス修飾子をコンストラクターと共に使用すると、コンパイラ エラーが発生します。

stdcall 呼び出し規約は __stdcall キーワードで宣言した静的メンバー関数とグローバル関数で使用され、変数引数リストを使用しません。 非静的メンバー関数 (コンストラクターなど) で __stdcall キーワードを使用すると、コンパイラで thiscall の呼び出し規約が使用されます。

基底クラスのコンストラクターは、派生クラスによって継承されません。 派生クラス型のオブジェクトが作成されるときは、最初に基底クラスのコンポーネントの構築が行われ、その後、派生クラスのコンポーネントに移ります。 コンパイラは、完全なオブジェクトのその部分が初期化されているものとして、各基底クラスのコンストラクターを使用します (仮想派生の場合は除きます。これについては、「Initializing Base Classes (基底クラスの初期化)」を参照)。

参照

関連項目

コンストラクター (C++)