序章
コンストラクターは、クラス オブジェクトをインスタンス化するときに自動的に呼び出してクラス オブジェクトを初期化することができる、前の記事で紹介しました: デフォルトのメンバー関数
の詳細な説明を参照してください
。コンストラクター本体内 初期化は実際には定義ではなくそれらへの代入です。次に、定義時にのみ値を与えることができ、定義後に変更できない一部の変数 (const 変数や参照変数など) や、デフォルトのコンストラクターのない一部のクラス型メンバー変数については、コンストラクターで定義できません。 。コンストラクターを使用すると、明らかにニーズを満たすことができません。
では、クラス オブジェクトがインスタンス化されるとき、これらのメンバー変数はどこで定義されるのでしょうか? 定義時にどのように初期化されるのでしょうか?
メンバー変数は、初期化子リストで定義および初期化されます。
初期化リスト
一般的なメンバー変数は複数回代入できますし、コンストラクター本体内で値を代入することももちろん可能です。ただし、コンストラクタ本体では代入のみが実現でき、メンバ変数は定義できないため、constメンバ変数、参照メンバ変数、デフォルトコンストラクタを持たないクラスメンバは定義できません。また、これらのメンバー変数は、初期化リストで明示的に定義して初期化する必要があります。
class A
{
public:
A(int a)
{
_a = a;
}
private:
int _a;
};
class B
{
public:
/* B(int b)
{
_b = b;
_c = b;
} */
//错误代码: 表达式不能是常量,A不能没有默认构造函数
private:
int& _b; //引用成员变量
const int _c; //const成员变量
A _obj; //没有默认构造函数的成员类
};
意味
初期化子リストはコンストラクター パラメーター リストの後に来て、コロンで始まり、データ メンバーのカンマ区切りリストが続き、各 "メンバー変数" の後に括弧で囲まれた初期値または式が続きます。
类名(参数列表)
: 成员变量(初始值)
, 成员变量(初始值)
, ...
{
}
初期化リストはメンバー変数が定義される場所であり、初期化リストで上記の 3 つのメンバー変数を定義して初期化できます。
class A
{
public:
A(int a)
{
_a = a;
}
private:
int _a;
};
class B
{
public:
B(int b)
: _b(b)
, _c(b)
, _obj(b) //在初始化列表调用其构造函数
{
}
private:
int& _b;
const int _c;
A _obj;
};
特性
- 各メンバー変数は、初期化リスト内に 1 回だけ出現できます(初期化は 1 回だけ実行できます)。
- 参照メンバー変数、const メンバー変数、およびデフォルトのメンバー関数を持たないメンバー クラスは、初期化のために初期化リストに配置する必要があります。
- カスタム タイプのメンバー変数の場合、初期化リストを使用して最初に定義および初期化が行われます(メンバー変数宣言で指定されたデフォルト値が初期化リストで使用されます)。
- クラス内でメンバー変数が宣言される順序は、初期化リスト内の順序に関係なく、初期化リスト内で初期化される順序になります (したがって、宣言の順序は初期化リスト内の順序と一致することをお勧めします)リスト):
class A
{
public:
A(int a)
: _a1(a)
, _a2(a1) //错误代码:未定义标识符a1
{
}
private:
int _a2;
int _a1;
};
要約する
これで初期化リストの導入は終わりましたが、
今後プログラミングを行う際には、初期化リストでメンバ変数を初期化することをお勧めします。もちろん、コンストラクター内で代入する必要がある場合もあり、たとえば、動的に領域を空ける必要がある場合、初期化リストは明らかに適切ではありません。
この部分を明確に紹介していない、またはこの部分に問題があると思われる場合は、コメント欄に指摘してください。
この記事が少しでもお役に立てましたら、ワンクリックでつながれば幸いです
皆さんと一緒に進歩していきたいと思っています