まず、mem-initializer-listとは何かを説明します。mem-initializer-listは、 mem-initializer のカンマ区切りのリストです。各mem-initializerは、メンバー名の後に が(
続き、その後にexpression-listが続き、その後に)
. 式リストは、メンバーの構築方法です。たとえば、
static const char s_str[] = "bodacydo";
class Example
{
private:
int *ptr;
string name;
string *pname;
string &rname;
const string &crname;
int age;
public:
Example()
: name(s_str, s_str + 8), rname(name), crname(name), age(-4)
{
}
};
ユーザー提供の引数なしコンストラクターのmem-initializer-listname(s_str, s_str + 8), rname(name), crname(name), age(-4)
は です。このmem-initializer-listは、name
メンバーが2 つの入力反復子を受け取るコンストラクターによって初期化され、std::string
rname
メンバーが への参照で初期化されname
、crname
メンバーが への const 参照で初期化されname
、メンバーがage
値で初期化されることを意味します-4
。
各コンストラクターには独自のmem-initializer-listがあり、メンバーは規定の順序 (基本的にはメンバーがクラスで宣言されている順序) でのみ初期化できます。したがって、 のメンバーは、、、、、およびExample
の順序でのみ初期化できます。ptr
name
pname
rname
crname
age
メンバーのmem-initializerを指定しない場合、C++ 標準は次のように述べています。
エンティティがクラス型 ... の非静的データ メンバである場合、エンティティはデフォルトで初期化されます (8.5)。... それ以外の場合、エンティティは初期化されません。
ここで、 はクラス型の非静的データ メンバーであるため、 mem-initializer-list で初期化子が指定されてname
いない場合は、デフォルトで初期化されます。の他のすべてのメンバーはクラス型を持たないため、初期化されません。name
Example
標準で初期化されていないと記載されている場合、これは、任意の値を持つことができることを意味します。したがって、上記のコードは初期化pname
されていないため、何でもかまいません。
参照は常に初期化する必要があるというルールなど、他のルールに従う必要があることに注意してください。参照を初期化しないのはコンパイラ エラーです。