0

< <과 C++의 >> 연산자를 오버로드하는 예제를 보았습니다. 그러나,이 지역 변수친구 함수에서 지역 변수의 참조 반환

class Date 
{ 
    int mo, da, yr; 
public: 
    Date(int m, int d, int y) 
    { 
     mo = m; da = d; yr = y; 
    } 
    friend ostream& operator<<(ostream& os, const Date& dt); 
}; 

ostream& operator<<(ostream& os, const Date& dt) 
{ 
    os << dt.mo << '/' << dt.da << '/' << dt.yr; 
    return os; 
} 

int main() 
{ 
    Date dt(5, 6, 92); 
    cout << dt; 
} 

내가 운영 체제는 지역 변수 (어떻게 든,없는 경우 나 정정) 생각에 대한 참조를 반환 것 같다 구현하는 모든 예제로 의심을 얻었다.

이 코드가 실제로 작동하는지는 잘 모르겠지만 대부분의 웹 참조에서 비슷한 구현을 발견했습니다.

참고 : 헤더 파일 포함 및 네임 스페이스 std 문 사용은 의도적으로 생략되었습니다.

미리 감사드립니다.

+2

그것은'지역 변수 – JLev

+6

참조, 아니다

사실

, 그건 당신이 기능의 연쇄 호출을 가능하게해야 할 일이다 os'는 지역 변수이지만 그것이 참조하는 객체는 지역 변수가 아닙니다. – VTT

+1

1. 로컬 변수가 아닙니다. 2. 친구는 그 일과 아무 상관이 없다. – juanchopanza

답변

3

os는 로컬 변수라고 생각합니다.

실제로는 아닙니다. os은 로컬 참조입니다. 그러나 그것은 비 로컬 객체에 바인딩됩니다.

그리고 비 const 왼쪽 값 참조이므로 수명이 함수 호출을 초과하는 객체에 바인드되어야합니다. 따라서 함수에서 반환 된 참조를 바인딩하는 것은 완벽합니다. 아무것도 매달리지 않을 것입니다. 단지 기능의 무리가 호출

std::cout << foo << bar << baz; 

은 다음과 같습니다 :

operator<<(operator<<(operator<<(std::cout, foo), bar), baz); 
+0

고맙습니다. :) –

+0

@KrishnaKumar [누군가 내 질문에 대답하면 어떻게해야합니까?] (https://stackoverflow.com/help/someone-answers) 주제를보십시오. – Ron

+0

이것은 100 % 사실이 아닙니다. 함수에 전달 된 매개 변수가 rvalue 인 경우 매달릴 수 있습니다. 예 :'std :: ostream & wrong = std :: operator << (std :: stringstream(), "Hello World"), ' – OriBS