- ベストアンサー
C++の変数の初期化
C++を勉強中です。JavaやC#、JavaScriptといった言語はひととおり使えます。 C++におけるクラスHogeの変数hogeの初期化で、以下のふたつの構文では意味が違うようですが、どのように違うのでしょうか? Hoge hoge; Hoge hoge();
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
前の人が言っている通りで Hoge hoge(); は関数宣言なので無理やりコンパイルを通そうとすると class Hoge{ }; void fuga(Hoge arg){ } Hoge hogeB(){ Hoge *poyo = new Hoge ; return *poyo ; } ; void piyo(void){ Hoge hogeA; fuga(hogeA); fuga(hogeB()); } こうなります。 ※これをマトモに参考にするとメモリーリークを起します。 Hoge hoge(x); とか引数をとるのであればコンストラクタのオーバーロードとして解釈可能ですが、 引数を取らないコンストラクタは定義済みなので( )を付けるとコンストラクタではなく関数と解釈されます。
その他の回答 (3)
- buriburi3
- ベストアンサー率44% (353/792)
> Hoge hoge(引数, ...); は引数ありのコンストラクタ呼び出しなのでしたか。 引数有りのコンストラクタが定義されていればコンストラクタと解釈可能なだけで関数定義されていれば関数です。 引数つきが全てオーバーロードされたコンストラクタでは無いので誤解しませんように。 ※メソッドでもオブジェクトでも無い関数はJavaにもC#にも無いですからピンとこないかもしれませんが。
お礼
なるほどです。 JavaScriptやHaskellなんかもかじってるので「関数」はわかりますが、 どちらかというと関数本体のなかで関数定義ができてしまうことや、 関数やコンストラクタ呼び出しの構文と定義の構文がかぶっていることがピンとこないです……。 C++は難しいですね。ありがとうございました。
- jacta
- ベストアンサー率26% (845/3158)
> Hoge hogeB(); > fuga(hogeB); //コンパイルエラー、conversion from `Hoge (*)()' to non-scalar type `Hoge' requested これは、hogeBが関数型であり、Hoge型に変換できないために発生しているエラーです。 > Hoge hoge(); > は質問文で述べたとおり、関数の宣言のことではありません。 それは、質問者さんが関数の宣言ではない「つもり」なだけです。コンパイラは関数の宣言だと受け取ります。
お礼
そうだったのですか。Hoge hoge(); は引数無しのコンストラクタを 呼んでいるのかと思ったら、全然違ったのですね。 ありがとうございました。
- jacta
- ベストアンサー率26% (845/3158)
> Hoge hoge; Hoge型のオブジェクトhogeの宣言 > Hoge hoge(); 引数を持たずHoge型を返す関数hogeの宣言
補足
ご回答ありがとうございます。 Hoge hoge(); は質問文で述べたとおり、関数の宣言のことではありません。 もしかしたら質問文がちょっとわかりにくかったかも知れないので サンプルコードを書きます。 以下のような違いについてご質問したいと思います。 環境はMinGW 5.1.3です。 class Hoge{ }; void fuga(Hoge arg){ } void piyo(void){ Hoge hogeA; fuga(hogeA); //OK Hoge hogeB(); fuga(hogeB); //コンパイルエラー、conversion from `Hoge (*)()' to non-scalar type `Hoge' requested }
お礼
Hoge hoge(); は関数宣言で、 Hoge hoge; は引数無しのコンストラクタ呼び出しで、 Hoge hoge(引数, ...); は引数ありのコンストラクタ呼び出しなのでしたか。 似たような構文なので Hoge hoge(); はコンストラクタ呼び出しだと 勘違いしていました。 Java等の構文に慣れている身としては少々意表を突かれる構文でした。 ありがとうございました。