5

これは、私が問題を抱えている単純なC++コンストラクターの概念です。

このコードスニペットを考えると:

#include <iostream>
using namespace std;

class Foo 
{
public:
    Foo ()      {       cout << "Foo()"  << endl;     }
    ~Foo ()     {       cout << "~Foo()" << endl;     }
};

int main()
{
    Foo f1;
    Foo f2();
}

出力は次のとおりです。

Foo()
~Foo()

Foo f2();何もしていないようです。何です Foo f2();かそしてなぜそれは何もしないのですか?

4

2 に答える 2

9

Foo f2();f2引数をとらず、タイプのオブジェクトを返すという名前の関数を宣言しますFoo

また、内部にコピーコンストラクターがある場合も考えてみてください。Foo

Foo (const Foo& obj)     
{     
     cout << "Copy c-tor Foo()"  << endl;    
} 

を書き込もうとするとFoo obj(Foo())、この場合、コピーc-torへの呼び出しが正しくないことが予想されます。

その場合obj、Fooオブジェクトを返し、関数へのポインタ型の引数を取る関数として解析されます。これは、 MostVexingParseとも呼ばれます。

コメントの1つで述べたFoo obj((Foo()));ように、コンパイラはそれを式として解析し(つまり、オブジェクトとして解釈し)、余分な。のために関数ではありません()

于 2011-12-06T05:25:37.880 に答える
4

実際には、f2をパラメーターを受け取らず、Fooを返す関数として宣言しています。

于 2011-12-06T05:24:37.963 に答える