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 对象并采用指向函数的类型指针参数的函数。这也被称为Most Vexing Parse

正如其中一条评论中提到的Foo obj((Foo()));那样,编译器会将其解析为表达式(即将其解释为对象)而不是函数,因为额外的().

于 2011-12-06T05:25:37.880 回答
4

您实际上将 f2 声明为不带参数并返回 Foo 的函数。

于 2011-12-06T05:24:37.963 回答