コンストラクターによる明示的初期化 (C++ のみ)
クラス・オブジェクトは、コンストラクターを用いて明示的に初期化されるか、 またはデフォルト・コンストラクターを持っていなければなりません。 コンストラクターを使用する明示的初期化は、集合体初期化の場合を除き、 非静的定数および参照クラス・メンバーを初期化する唯一の方法です。
暗黙的に宣言されるか 明示的にデフォルト設定されたコンストラクターのみを持ち、ユーザー宣言のコンストラクター、仮想関数、private または protected の非静的データ・メンバー、および基底クラスのいずれも持たないクラス・オブジェクトは、集合体 と呼ばれます。 集合体の例としては、C 形式の構造体および共用体があります。
クラス・オブジェクトを作成する場合、そのオブジェクトを明示的に初期化します。 クラス・オブジェクトを初期化するには、次の 2 つの方法があります。
- 括弧で囲んだ式のリストの使用。 コンパイラーは、このリストをコンストラクターの引数リストとして使用し、 クラスのコンストラクターを呼び出します。
- 単一初期化値、および = 演算子の使用。 このような型の式は、代入でなく初期化なので、代入演算子関数 (これが存在する場合でも) は、呼び出されません。 単一引数の型は、コンストラクターに対する最初の引数の型と 一致していなければなりません。コンストラクターに残りの引数がある場合、これらの引数は デフォルト値を持っている必要があります。
初期化指定子の構文 >>-+-(--expression--)-------------------+---------------------->< '-=--+-expression------------------+-' | .-,----------. | | V | | '-{----expression-+--+---+--}-' '-,-'
次の例は、クラス・オブジェクトを明示的に初期化するいくつかの コンストラクターの宣言および使用の方法を示します。
// This example illustrates explicit initialization
// by constructor.
#include <iostream>
using namespace std;
class complx {
double re, im;
public:
// default constructor
complx() : re(0), im(0) { }
// copy constructor
complx(const complx& c) { re = c.re; im = c.im; }
// constructor with default trailing argument
complx( double r, double i = 0.0) { re = r; im = i; }
void display() {
cout << "re = "<< re << " im = " << im << endl;
}
};
int main() {
// initialize with complx(double, double)
complx one(1);
// initialize with a copy of one
// using complx::complx(const complx&)
complx two = one;
// construct complx(3,4)
// directly into three
complx three = complx(3,4);
// initialize with default constructor
complx four;
// complx(double, double) and construct
// directly into five
complx five = 5;
one.display();
two.display();
three.display();
four.display();
five.display();
}
上記の例で作成される出力は次のようになります。
re = 1 im = 0
re = 1 im = 0
re = 3 im = 4
re = 0 im = 0
re = 5 im = 0
関連情報