为什么运算符()的奇怪行为?

时间:2015-02-19 04:36:40

标签: c++ constructor compiler-errors operator-overloading

我有简单的课程,

class Func
{
public:
    Func()
    {
        cout<<"Constructor"<<endl;
    }

    int operator()(int)
    {
        cout<<"Operator ()";
        return 0;
    }
};
  1. 当我通过括号Func f();创建它的对象时,它不打印任何内容,它应该打印 Constructor 。但是当我创建没有括号的对象时,它会打印出预期的 Constructor 。这两者之间有什么不同?
  2. 当我尝试使用operator()f(2)时,它会给我编译错误。
  3.   

    错误C2660:'f':函数不带1个参数

    这不是奇怪的行为还是我遗失了什么?

2 个答案:

答案 0 :(得分:3)

  

Func f();,它什么都不打印,应该打印构造函数

这不是真的。

以下是如何创建Func

Func f;
  

当我尝试使用operator()f(2)时,它给出了编译错误。错误C2660:&#39; f&#39; :function不带1个参数。这不是奇怪的行为,或者我错过了什么?

是的,这很奇怪,但并不出人意料。当您编写Func f()时,您声明了一个名为f的函数,返回Func。在此之后你尝试用f做的一切自然都会被打破。

答案 1 :(得分:1)

这里有点有趣。

Func f();

是函数的前向声明,它不接受任何参数并返回Func类型对象。

检查以下代码:

#include <iostream>
using namespace std;

class Func
{
public:
    int operator()(int)
    {
        return 0;
    }
};

int main ()
{
    Func f();
    f();
    return 0;
}

Func f ()
{
    cout << "My Func" << endl;
    Func * f = new Func;
    return *f;
}

它将输出&#34; My Func&#34;在stdout上。