dポイントプレゼントキャンペーン実施中!

C++を勉強中です。JavaやC#、JavaScriptといった言語はひととおり使えます。
C++におけるクラスHogeの変数hogeの初期化で、以下のふたつの構文では意味が違うようですが、どのように違うのでしょうか?

Hoge hoge;

Hoge hoge();

A 回答 (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);
とか引数をとるのであればコンストラクタのオーバーロードとして解釈可能ですが、
引数を取らないコンストラクタは定義済みなので( )を付けるとコンストラクタではなく関数と解釈されます。
    • good
    • 0
この回答へのお礼

Hoge hoge(); は関数宣言で、
Hoge hoge; は引数無しのコンストラクタ呼び出しで、
Hoge hoge(引数, ...); は引数ありのコンストラクタ呼び出しなのでしたか。
似たような構文なので Hoge hoge(); はコンストラクタ呼び出しだと
勘違いしていました。
Java等の構文に慣れている身としては少々意表を突かれる構文でした。
ありがとうございました。

お礼日時:2008/03/31 03:21

> Hoge hoge(引数, ...); は引数ありのコンストラクタ呼び出しなのでしたか。


引数有りのコンストラクタが定義されていればコンストラクタと解釈可能なだけで関数定義されていれば関数です。
引数つきが全てオーバーロードされたコンストラクタでは無いので誤解しませんように。
※メソッドでもオブジェクトでも無い関数はJavaにもC#にも無いですからピンとこないかもしれませんが。
    • good
    • 0
この回答へのお礼

なるほどです。
JavaScriptやHaskellなんかもかじってるので「関数」はわかりますが、
どちらかというと関数本体のなかで関数定義ができてしまうことや、
関数やコンストラクタ呼び出しの構文と定義の構文がかぶっていることがピンとこないです……。
C++は難しいですね。ありがとうございました。

お礼日時:2008/04/06 18:35

> Hoge hogeB();


> fuga(hogeB); //コンパイルエラー、conversion from `Hoge (*)()' to non-scalar type `Hoge' requested

これは、hogeBが関数型であり、Hoge型に変換できないために発生しているエラーです。

> Hoge hoge(); 
> は質問文で述べたとおり、関数の宣言のことではありません。

それは、質問者さんが関数の宣言ではない「つもり」なだけです。コンパイラは関数の宣言だと受け取ります。
    • good
    • 0
この回答へのお礼

そうだったのですか。Hoge hoge(); は引数無しのコンストラクタを
呼んでいるのかと思ったら、全然違ったのですね。
ありがとうございました。

お礼日時:2008/03/31 03:15

> 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
}

補足日時:2008/03/30 21:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!