「メンバー初期化子」という奇妙な概念に出くわしました。
ここでは次のように述べています。
C++11 では、メンバー初期化子 (コンストラクターがメンバー自体を初期化しなかった場合にクラス スコープでメンバーに適用される式) が追加されました。
その定義は何ですか?
その使用法を説明する例はありますか?
「メンバー初期化子」という奇妙な概念に出くわしました。
ここでは次のように述べています。
C++11 では、メンバー初期化子 (コンストラクターがメンバー自体を初期化しなかった場合にクラス スコープでメンバーに適用される式) が追加されました。
その定義は何ですか?
その使用法を説明する例はありますか?
おそらく、クラス内のメンバー初期化子を参照しています。これにより、宣言の時点で非静的データ メンバーを初期化できます。
struct Foo
{
explicit Foo(int i) : i(i) {} // x is initialized to 3.1416
int i = 42;
double x = 3.1416;
};
詳細については、Bjarne Stroustrup の C++11 FAQを参照してください。
コンストラクターで共有されるクラスにイニシャライザーを追加できるようになりました。
class A
{
int i = 42;
int j = 1764;
public:
A() {} // i will be 42, j will be 1764
A( int i ) : i(i) {} // j will be 1764
};
コンストラクターでイニシャライザーを繰り返す必要がなくなります。これは、大規模なクラスの場合、真に有利になる可能性があります。
C++11 では、次のような非静的メンバーの初期化が可能です。
class C
{
int a = 2; /* This was not possible in pre-C++11 */
int b;
public:
C(): b(5){}
};
メンバー初期化子は、クラス定義で設定できる初期化子の拡張を参照しています。たとえば、次のように使用できます。
struct foo
{
std::string bar = "hello";
std::string baz{"world"};
foo() {} // sets bar to "hello" and baz to "world"
foo(std::string const& b): bar(b) {} // sets bar to b and baz to "world"
};
メンバー初期化子リストが別の値を与えない場合に初期bar
化します。hello
メンバー初期化子は組み込み型に限定されないことに注意してください。メンバー初期化子リストで統一された初期化構文を使用することもできます。
ここから:-
非静的データ メンバー初期化子は、かなり単純な新機能です。実際、GCC Bugzilla は、初心者の C++ ユーザーが C++98 で構文が違法だったときに、しばしばそれを使用しようとしたことを明らかにしています! 同じ機能がJavaでも利用できると言わなければならないので、それをC++に追加すると、両方の言語を使用している人々の生活が楽になります.
struct A
{
int m;
A() : m(7) { }
};
struct B
{
int m = 7; // non-static data member initializer
};
thus the code:
A a;
B b;
std::cout << a.m << '\n';
std::cout << b.m << std::endl;