1. ホーム
  2. c++

フィールドとコンストラクタのパラメータに同じ名前を使用することはできますか?

2023-10-01 23:55:49

質問


class C {
  T a;
public:
  C(T a): a(a) {;}
};

それは合法ですか?

どのように解決するのですか?

はい、これは合法であり、すべてのプラットフォームで動作します。 メンバ変数 a を、渡された値 a に正しく初期化します。

しかし、全てではありませんが、異なる名前を付ける方がよりクリーンであると考えられている人もいます。 私は個人的に実際にそれをよく使っています :)

初期化リストの初期化項目の構文は以下の通りなので、同じ変数名を持つ初期化リストが機能します。

<メンバー>(<値>)

上に書いたことは、次のような簡単なプログラムを作ることで確認できます(コンパイルはされません)。

class  A
{

   A(int a)
   : a(5)//<--- try to initialize a non member variable to 5
   {
   }
};

次のようなコンパイルエラーが出ます。A は 'a' という名前のフィールドを持っていません。


余談ですが

一つの理由は、あなたが を必要としないかもしれません。 をパラメータ名と同じメンバー名で使用するのは、次のようなことが起こりやすくなるからです。

class  A
{

   A(int myVarriable)
   : myVariable(myVariable)//<--- Bug, there was a typo in the parameter name, myVariable will never be initialized properly
   {
   }
   int myVariable;
};


余談ですが(2)。

理由の一つは、あなたが が必要かもしれません。 をパラメータ名と同じメンバー名にすることで、次のようなことが起こりにくくなります。

class  A
{

   A(int myVariable_)
   {
     //<-- do something with _myVariable, oops _myVariable wasn't initialized yet
     ...
     _myVariable = myVariable_;
   }
   int _myVariable;
};

これは、大きな初期化リストで、初期化リストで初期化する前に_myVariableを使用した場合にも起こりえます。