在代码中调用c ++ operator int为什么?

时间:2014-06-18 13:58:04

标签: c++

在下面的代码段中

#include <iostream>

class A
{
public:
    A(int i) : m_i(i) { }

public:
    int operator()(int i = 0) const 
    {
        return m_i + i; 
    }

    operator int () const
    {
        return m_i;
    }
    operator float () const
    {
        return 0.0;
    }

private:
    int m_i;

    friend int g(const A&);
};

int f(char c)
{
    return c;
}

int g(const A& a)
{
    return a.m_i;
}

int main()
{
    A f(2), g(3);
    int i = f;// call 1

    std::cout << f(1) << g(f) << std::endl;// call 2

    return 0;
}

我给了一些评论,比如在主函数中调用1和调用2。 我理解为什么在调用1 时调用operator int。 但是我无法理解为什么在//呼叫2 有些人可以解释一下为什么会这样。

3 个答案:

答案 0 :(得分:2)

函数g在范围内由g(类型A)隐藏。所以g(f)将f转换为int,然后使用转换结果调用g.operator()(int)。

答案 1 :(得分:1)

当你调用g(f)时,为g调用A :: operator()(int i = 0)。

因此必须将

f转换为int,这是通过A :: operator int()。

完成的

答案 2 :(得分:0)

std::cout << f(1) << g(f) << std::endl;

让我们将其分解为函数调用而不是运算符。 (这可能不是技术上正确的语法。)

int temp1 = f.operator()(1);
ostream& temp2 = std::cout.operator<<(temp1);
// By the implementation of ostream::operator<<, temp2 is a reference to std::cout.
// The compiler doesn't know this, though, and must treat it as if it could be different.
int temp3 = f.operator int(); // Typecast since A::operator() expects an `int`.
int temp4 = g.operator()(temp3);
ostream& temp5 = temp2.operator<<(temp4);
// temp5 is another reference to std::cout.
temp5.operator<<(std::endl);
// Result discarded.