中括弧で囲まれた構文を使用してクラス データ メンバーを初期化できないのはなぜですか?

Linda Hamilton
リリース: 2024-11-16 08:30:03
オリジナル
628 人が閲覧しました

Why Can't Class Data Members Be Initialized Using Brace-Enclosed Syntax?

クラス データ メンバーの直接初期化構文が禁止されている理由

C では、クラス データ メンバーは ( ) 中括弧で囲まれた構文。次のコードを考えてみましょう:

class test {
public:
    void fun() {
        int a(3);
        std::cout << a << '\n';
    }

private:
    int s(3);    // Compiler error
};
ログイン後にコピー
次のようなエラーでコンパイルが失敗します:

    "expected identifier before numeric constant"
  • "expected ',' or '。 ..' 数値定数の前に"
では、なぜこの制限があるのでしょうか?

初期の C 提案と標準の議論によると、この禁止事項は

解析の曖昧さを防ぐことを目的としています 。中括弧で囲まれた初期化が許可されている場合、コンパイラーは次のような状況で宣言を誤って解釈する可能性があります。

struct S {
    int i(x); // data member with initializer
    // Other code
    static int x;
};
ログイン後にコピー
ここでは、i(x) がデータ メンバー初期化子であるかメンバー関数宣言であるかは不明であり、両方とも次のようになります。同じ構文です。

このあいまいさに対処するために、C は次の制限を選択しました:

    データ メンバーは、=initializer-clause または {initializer-list } 構文のいずれかを使用して初期化する必要があります。 .
  • メンバー関数は、宣言に常に () {} 構文を使用する必要があります。
この決定により、解析の問題が回避され、コードが明確になります。

以上が中括弧で囲まれた構文を使用してクラス データ メンバーを初期化できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート