ホームページ > バックエンド開発 > C++ > C でクラス内データ メンバーを初期化するのに括弧を使用できないのはなぜですか?

C でクラス内データ メンバーを初期化するのに括弧を使用できないのはなぜですか?

Barbara Streisand
リリース: 2024-11-15 13:44:02
オリジナル
281 人が閲覧しました

Why Can't We Use Parentheses to Initialize In-Class Data Members in C  ?

クラス内データ メンバーの初期化の異常: C 標準の詳細を調べる

() で直接初期化できるローカル データ メンバーとは異なります構文では、クラス内データ メンバーはこの便利なメソッドを無視します。この特殊性により、多くのプログラマーが困惑し、その根本的な理論的根拠についての疑問が生じています。

C 標準によれば、解析のあいまいさを防ぐために、() を使用したクラス データ メンバーの直接初期化は禁止されています。次のシナリオを考えてみましょう:

class S {
public:
    int i(x); // data member with initializer
};
ログイン後にコピー

この制限がないと、コンパイラは、宣言が初期化子を持つデータ メンバーを参照しているのか、それともメンバー関数宣言を参照しているのかを判断しようとするときに混乱する可能性があります。

例:

struct S {
    int i(j); // member function declaration
    int j; // data member without an initializer
};
ログイン後にコピー

あいまいな状況でデータ メンバーよりもメンバー関数を優先する既存の解​​析ルールを適用すると、誤った結果が生じる可能性があります。解釈。このような混乱を避けるために、C 標準ではクラス データ メンバーの直接初期化を禁止することを選択しました。

それでも、= 初期化節構文を使用するなど、代替の初期化メソッドは引き続き使用できます。

int s = 3;
ログイン後にコピー

または、中括弧で囲まれた初期化子リスト:

int s{3};
ログイン後にコピー

これらに従うことでメソッドを使用すると、プログラマは、ローカルの対応するものとは異なる構文を使用しても、クラス データ メンバーを効果的に初期化できます。

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

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