簡體   English   中英

具有默認構造函數的類中的重載()運算符

[英]Overloading () operator in a class with default constructor

我意識到這不一定是你想要做的事情,但是前幾天我遇到了類似的代碼。 所以,我想更多地研究一下這個想法......

我有一個重載了構造函數和仿函數的類。 這按預期工作。 但是,當你使用默認構造函數調用一個類然后嘗試使用該仿函數時,它會失敗(因為它無法弄清楚如何將類轉換為int,這不是我想要的,無論如何。)這樣做的正確方法是什么?

#include <cstdio>

class foo
{
public:
    foo(int a, int b);
    foo();
    int operator()();
private:
    int result;
};

foo::foo(int a, int b)
{
    printf("I am a foo(int, int). a: %d b: %d\n", a, b);
    result = a + b;
}

foo::foo()
{
    printf("I am a base foo!\n");
    result = -1;
}

int foo::operator()()
{
    return result;
}

int main(void)
{
    int ret1 = -12345;
    int ret2 = -12345;

    foo myfoo(3, 8);
    foo otherfoo();

    ret1 = myfoo();
    ret2 = otherfoo(); //fails. Also, otherfoo()() fails.

    printf("foo: %d otherfoo: %d\n", ret1, ret2);

return 0;
}

令人驚訝的是

foo otherfoo();

聲明一個函數而不是一個對象。 有關討論,請參閱C ++ Gotchas(問題#19:函數/對象歧義)

要修復,請將該行更改為

foo otherfoo;

或者,在C ++ 11中,到

foo otherfoo{};

函數聲明和對象定義之間存在着一種矛盾。 它們具有相同的語法。 因此決定將此語法視為函數聲明。 因此在這個聲明中

foo otherfoo();

有一個函數聲明,返回類型為foo,不接受參數。

要使用默認構造函數定義類的對象,同時對其成員進行零初始化,可以使用以下語法

foo otherfoo {};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM