2014-06-18 2 views
-2

나는 전화 1과 같은 몇 가지 의견을주고 주요 기능 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; 
} 

니펫을. operator int가 에 호출 된 이유를 이해했습니다.으로 전화하십시오. 하지만 왜 전화가 왔는지 이해할 수 없었습니다. 왜 그렇게하는지 설명 할 수 있습니까?

+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)를 호출하면 A :: operator() (int i = 0)가 호출됩니다.

f는 A :: operator int()를 통해 수행되는 int로 변환되어야합니다.

관련 문제