フィールドとコンストラクタのパラメータに同じ名前を使用することはできますか?
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を使用した場合にも起こりえます。
関連
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] JVM起動時のパラメータ「-Xms」「-Xmx」とは何ですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] ベースクラスのコンストラクタを呼び出す際のルールは?
-
[解決済み] 抽象クラスはコンストラクタを持つことができますか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み] C++規格で認められているメンバ変数と同じ名前をコンストラクタの引数に使ってメンバ変数を初期化すること?重複