- ベストアンサー
関数プロトタイプについての質問
クラスのヘッダー内のコンストラクタを定義している部分で、 class クラスAAA : public CStatic { public: クラスAAA(構造体BBB* aabbcc); のように引数に構造対BBB*型の変数aabbccを宣言していたのですが、ある日、ふと気がつくとaabbccがaabbcと1文字欠けた状態になっていました(無意識に削除してしまったようです)。 <削除後> class クラスAAA : public CStatic { public: クラスAAA(構造体BBB* aabbc); ただ、この場合でもaabbccのとき同様にアプリは正常に稼動していました。動作の違いも<削除前>とで何もありませんでした。 なぜ文字が欠けた状態でも正常に稼動したのかよくわかっておりません。コンパイルの際になぜ、エラーが出なかったのかもわかっておりません。どなたかご教授願えますでしょうか?宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
宣言の中の仮引数の名前は必要ないからです。 全て削除してしまっても文法的にはかまわなかったはずです。 メソッド(例ではコンストラクタ)を定義する部分では仮引数の名前を省略することはできません。また定義中で仮引数を参照する場合は定義の仮引数リストで使った名前を使います。 # 宣言の中の仮引数名と定義の仮引数名が一致している必要はありません
その他の回答 (2)
- jacta
- ベストアンサー率26% (845/3158)
> クラスAAA(構造体BBB* aabbc); ここで直接 クラスAAA(構造体BBB* aabbc) { ... } のように関数本体を定義していれば話は別ですが、今回は宣言だけのようですので問題ありません。 もう少し詳しく書くと、関数の仮引数名は、同じ関数の宣言(定義を含む)が複数あった場合、それぞれ別の名前を付けても問題ありません。また、仮引数名を省略することも可能です。
- crew21
- ベストアンサー率26% (58/222)
パッと思いつくのは、そのコンストラクタの中で、aabbcが参照されてないのではないですか。 一般的には、そのクラス内のprivate変数の初期化の際などにaabbcをセットするというやり方をしますが、たまたま(?)そういうことをしていないのではないですか? もしセットする際に、元のaabbccが使われていたら、間違いなくコンパイルエラーになりますからね。 もし長文でなければ、コンストラクタの中を見てみたいな...
お礼
>宣言の中の仮引数の名前は必要ないからです。 >全て削除してしまっても文法的にはかまわなかったはずです。 本当ですね。削除しても動作的に問題ありませんでした。 関数プロトタイプに関しての知識が足らなかったのですね。 ありがとうございました。