【问题标题】:Why strange behaviour with operator()? [duplicate]为什么 operator() 有奇怪的行为? [复制]
【发布时间】:2015-02-19 04:36:39
【问题描述】:

我的课很简单,

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

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

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

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

【问题讨论】:

  • 因为您将f 声明为一个不带参数并返回Func 对象的函数
  • @ShafikYaghmour 不要认为它是“最”令人烦恼的。这是 IMO 为 Foo f(Bar(), Baz()); 之类的东西保留的
  • @T.C.我问了斯科特这件事,他说它们都是最令人烦恼的解析
  • @ShafikYaghmour Scott Meyers?

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


【解决方案1】:

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

这不是真的。

这是创建Func 的方法:

Func f;

当我尝试使用 operator() f(2) 时,它给了我编译错误。错误 C2660:“f”:函数不接受 1 个参数。这不是奇怪的行为还是我遗漏了什么?

是的,这很奇怪,但并不意外。当您编写Func f() 时,您声明了一个名为f 的函数,它返回一个Func。在那之后,您尝试使用f 做的一切自然而然地被破坏了。

【讨论】:

  • 但是当我有一个参数构造函数时它可以工作。
  • @PranitKothari:100% 不相关。
  • 但是为什么呢?对于 0 args 和 1 args,它是否应该有那么大的不同。
  • @PranitKothari 如果你真的想声明一个返回 Func 并且不带参数的函数,你会写什么?
  • @T.C.明白你的意思。
【解决方案2】:

这里有点意思。

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

它将在标准输出上输出“My Func”。

【讨论】:

  • f 函数存在内存泄漏。
  • 是的,我刚才提到这个是为了说明问题。
  • @AbhishekMittal:无论如何,你在教一个坏掉的函数。
猜你喜欢
  • 1970-01-01
  • 2020-08-01
  • 2010-10-07
  • 1970-01-01
  • 2012-04-29
  • 2016-04-30
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
相关资源
最近更新 更多