ホームページ > バックエンド開発 > C++ > C ではコンストラクターの引数とメンバー変数の名前を重複させることができますか?

C ではコンストラクターの引数とメンバー変数の名前を重複させることができますか?

Mary-Kate Olsen
リリース: 2024-11-12 21:49:01
オリジナル
561 人が閲覧しました

Are Constructor Argument and Member Variable Names Allowed to Overlap in C  ?

コンストラクターの初期化子リスト: メンバー変数との名前の重複

コンストラクターの引数と同じ名前を使用してメンバー変数を初期化する慣行には疑問が生じていますその有効性と C 標準への準拠について。この実践に関する標準の視点を見てみましょう。

C 標準 §12.6.2/7 によれば、メンバー初期化子の式リスト内の式はコンストラクターのスコープ内で評価されます。したがって、コンストラクター引数とメンバー変数の両方に同じ名前を使用することが明示的に許可されています。

たとえば、次のコード スニペットは C 標準に完全に準拠しています。

class Blah {
  std::vector<int> vec;

public:
  Blah(std::vector<int> vec): vec(vec) {}

  // ...
};
ログイン後にコピー

Inこの場合、コンストラクター引数 vec は、メンバー変数 vec を曖昧さなく初期化するために使用されます。

さらに、標準では次のことが許可されています。初期化されるオブジェクトを参照するためにメンバー初期化子で this ポインターを使用する。これにより、次の例に示すように、他のメンバー変数に基づいてメンバー変数を初期化できるようになります。

class X {
  int a;
  int b;
  int i;
  int j;

public:
  X(int i): r(a), b(i), i(i), j(this->i) {}

  // ...
};
ログイン後にコピー

ただし、コンストラクター パラメーターを const 参照として渡すと、コンストラクター パラメーターを回避することでコードの効率が向上することに注意してください。元のベクター オブジェクトの不必要なコピー。これは、コンストラクターを次のように変更することで実現できます:

Blah(const std::vector<int> &vec): vec(vec) {}
ログイン後にコピー

以上がC ではコンストラクターの引数とメンバー変数の名前を重複させることができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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