コンストラクター初期化子リストでの配列メンバーの初期化
C は、コンストラクターでメンバー初期化子リストを使用してクラス メンバーを初期化する機能を提供します。ただし、この方法で配列メンバーを初期化すると、コンパイル エラーが発生する可能性があります。
以下のコード スニペットは、コンストラクター初期化子リストで配列メンバーの初期化を試行しましたが、コンパイルに失敗することを示しています:
class C { public: C() : arr({1,2,3}) { // doesn't compile } /* C() : arr{1,2,3} // doesn't compile either } */ private: int arr[3]; };
この問題の理由は、配列の初期化に関する制限にあります。次の例に示すように、配列は代入構文 ('=') によってのみ初期化できます。
int arr[3] = {1,3,4};
質問と回答:
1 。コンストラクター初期化子リストで配列を初期化する方法
コンストラクター初期化子リストで配列を初期化するには、配列をメンバー変数として含む構造体を使用する必要があります:
struct ArrStruct { int arr[3]; ArrStruct() : arr{1,2,3} { } }; class C { public: C() : arr_struct(ArrStruct()) { } private: ArrStruct arr_struct; };
このアプローチには、配列を保持するための別の構造体を作成し、その構造体をその内部で初期化することが含まれます。コンストラクター。
2. C 03 標準と配列の初期化
C 03 標準は、コンストラクター初期化子リスト内の集合体 (配列を含む) の初期化に明示的に対処していません。元の例のコードが無効であるのは、初期化リストによる集約の直接初期化を禁止する一般規則に起因します。
3. C 11 リストの初期化
C 11 リストの初期化は、この問題の解決策を提供します。ただし、元の質問の構文は正しくありません。正しい構文は次のとおりです。
struct A { int foo[3]; A() : foo{1, 2, 3} { } };
中括弧を使用すると、C 11 のリスト初期化機能が直接トリガーされます。
以上がC コンストラクター初期化子リストで配列を初期化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。