ホームページ >バックエンド開発 >C++ >## シャドーイングは C のクラス内の変数アクセスにどのような影響を与えるのでしょうか?

## シャドーイングは C のクラス内の変数アクセスにどのような影響を与えるのでしょうか?

DDD
DDDオリジナル
2024-10-29 07:32:30569ブラウズ

## How can Shadowing Affect Variable Access within a Class in C  ?

クラス内の変数のシャドウイング: 難問

この調査は、クラス内で定義された変数の動作を中心にしています。次の Measure という名前のクラスについて考えてみましょう:

<code class="c++">class Measure {
    int N;
    double measure_set[];
    char nomefile[];
    double T;

    // ...
};</code>

目的は、.dat ファイルからデータを meter_set 配列に読み取り、ユーザー入力を T 変数に読み取る get メソッドを実装することです。ただし、提供された実装では、T 値をmeasure_set[0] に格納しているようです。

シャドウイングについて

C では、同じ名前の変数を宣言することができます。さまざまな範囲で。これはシャドウイングとして知られています。コンパイラは各変数をそれぞれのスコープに関連付けます。そのスコープ内では、変数のローカル定義が同じ名前の他の宣言よりも優先されます。

提供されたコードでは、T 変数は両方のメンバーとして定義されています。 Measure クラスの変数として、また get メソッド内のローカル変数として使用されます。メソッド内で T メンバー変数を取得しようとすると、代わりにローカル変数 debido にアクセスしてシャドウイングします。

シャドウイングの回避

この問題を解決するには、次のことが必要です。異なるスコープ内の変数に一意の名前を使用することでシャドウイングを回避します。一般的な規則は、メンバー変数の前に「m_」や「this_」などの適切な識別子を付けることです。これにより、同じ名前のローカル変数とは区別されます。

たとえば、次の変更されたコードでは、メンバー変数に「_m」プレフィックスを使用します。

<code class="c++">void Measure::get() {
    // ...
    cout << "Insert temperature:" << endl;
    cin >> m_T;
    // ...
}</code>

追加考慮事項

  • 意図しない変更を防ぐために、アクセサー メソッドの戻り値には定数参照 (const std::string&) を使用することをお勧めします。
  • メンバー関数構文の使用明確さと読みやすさの観点から、変数への直接アクセス (例: m_nomefile と nomefile() の比較) の代わりに、アクセサーを使用することが推奨されます。
  • アクセサーを使用すると、コードの保守性が維持され、メンバー変数を誤って直接変更する可能性が減ります。

以上が## シャドーイングは C のクラス内の変数アクセスにどのような影響を与えるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。