2014-10-05 3 views
2

함수 (예 : T& func(){...})에서 참조를 반환하고 싶을 때 이해가 안됩니다. 예를 들어함수에서 참조를 언제 반환합니까?

는 :

T& func() { 
    Something t; 
    return t; 
} 

t라는 Something 인스턴스를 만든 다음 참조를 반환합니다. 범위를 벗어나면 t이 손실됩니다. 그래서 참조는 0을 말하는 것 같아 ..?

즉 다른 말로하면 왜 참조 또는 const 참조를 반환하겠습니까? 설명하고 예제를 제공하십시오.

+2

함수에 정의 된 정적 변수에 대한 참조를 반환하는 경우는 일반적이지 않습니다. 또한 멤버 함수는 종종 참조를 반환합니다. 참조가 함수보다 오래 지속되는 객체에 대한 것이면 언제든지 이해할 수 있습니다. – Galik

+0

다른 예는 max입니다. 샘플 구현의 반환 유형에주의를 기울이십시오. http://www.cplusplus.com/reference/algorithm/max/ –

+0

참조가 마술처럼 '0'을 참조하기 시작합니다. 그게 무슨 뜻이야? –

답변

3

종종 함수의 인수 중 하나에서 멤버를 반환 할 때이를 수행합니다. 표준 라이브러리의 예 :

T& func() { 
    static Something t; // this will exist until program closes 
    return t; 
} 

정적 초기화의 순서를 포함하는 전투 문제를 도움이되는 기술이다 :

template<class T, size_t n> 
struct array 
{ 
    T data[n]; 

    T& operator[](size_t i) { return data[i]; } 
}; 
1

은 때때로 당신은 함수에 정의 된 정적 변수에 대한 참조를 반환합니다.

분명히 멤버 변수 (난 당신이 비록 사람들에 대해 물어하지 않을거야) 이해 할 수

: 또한 때때로 당신은 함수에 전달 된 개체를 반환 할

T& MyType::func() { 
    return this->t; // persists with the object 
} 

을 함께 체인 기능을 할 수 있습니다

std::ostream& operaor<<(std::ostream& os, const MyType& t) { 
    // blah blah 
    return os; // pass it back out 
} 

좋아 :

if(std::getline(input >> size >> std::ws, line)) 
{ 
    // size and line were successfully read here 
} 
0

당신이 생각할 수있는 포인터보다 작은 참조. 함수에서 포인터를 반환 할 때마다 참조 유형을 반환 할 수 있습니다.

참조를 반환하는 것과 관련된 문제는 범위 문제입니다. 범위 문제가없는 한,이 도구는 귀하가 처분 할 수있는 또 다른 도구 일뿐입니다.

0

현재 개체에 대한 참조를 반환하는 것은 사용자 정의 할당 연산자를 구현하는 데 사용됩니다. 등 사업자 +=, -=, *=의 과부하를 구현할 때 그것은 또한 반환 형식으로 사용됩니다

class Foo 
{ 
    Foo& operator=(const Foo&); 
    //... 
}; 

는 이러한 연산자는 반환 형식이 조정 된 현재의 객체가 아닌 새로운 객체임을 시사한다. 따라서 현재 객체를 반환하려면 *this에 대한 참조를 반환합니다.

관련 문제