2014-06-18 44 views
-2

在下面的代碼片斷在代碼中調用C++操作符int爲什麼?

#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的主要功能。 我明白爲什麼操作符int在調用1。 但我不明白爲什麼在/ /致電2 有些身體可以解釋我爲什麼如此。

+2

擺脫您的'f'和'g'功能。他們沒有被用在代碼中。 – ghostofstandardspast

+4

如果你沒有命名一個變量和一個相同名稱的函數,它可能會變得更清晰。 –

+0

其在線測試中的問題。我剛剛在這裏複製。 – Vishwamithra

回答

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. 
2

函數g在範圍內由g(類型A)隱藏。因此,g(f)將f轉換爲int,然後使用轉換結果調用g.operator()(int)。

1

當你調用g(f)時,爲g調用A :: operator()(int i = 0)。因此必須將f轉換爲int類型,這通過A :: operator int()來完成。

相關問題