前述のように、初期化子リストを使用してオブジェクトのconstメンバーを初期化する必要があります。
/* a.h */
class A {
private:
const string cs;
public:
A(const string &value) :
cs(value) // <---- initialize here!.
{};
};
これは、クラスのすべてのconstメンバーで同じです。
class A {
private:
const string cs;
const float numberofthebeast;
const char z;
public:
A(const string &value, const float number, const char character) :
cs(value),
numberofthebeast(number),
z(character)
{};
};
各値を初期化するコンストラクターを提供したくない場合は、デフォルトコンストラクターでデフォルト値を提供できますが、構築後に値を変更することはできないことに注意してください。
class A {
private:
const string cs;
const float numberofthebeast;
const char z;
public:
A(const string &value, const float number, const char character) :
cs(value),
numberofthebeast(number),
z(character)
{};
// Default values!!!
A() :
cs("default ctor"),
numberofthebeast(666.666f),
z('Z')
{};
};
コンストラクター初期化子リストは、デフォルトのコンストラクターを提供しない複雑なデータの参照など、他のメンバーを初期化する場合にも役立ちます。
const unsigned float PI = 3.14f;
class Weird
{
Weird (int w);
// no default ctor!
int W;
};
class Foo
{
// Error: weird doesn't provide default ctor,
Weird w;
// Error: reference uninitialized.
float π
};
class Bar
{
Bar() :
// Ok, Weird is constructed correctly.
w(1),
// Ok, pi is initialized.
pi(PI)
{};
Weird w;
float π
};