2011-07-02 1 views
3

다음은 웹 사이트의 예입니다. http://www.cplusplus.com/doc/tutorial/classes2/ 작동 예제입니다. 그러나 왜 개체 온도가 연산자 + 오버로드 함수에서 반환 될 수 있는지 이해할 수 없습니다. 코드 외에도 몇 가지 의견을 남겼습니다.C++의 함수 내에서 객체 참조를 반환하는 것이 좋은 이유는 무엇입니까?

// vectors: overloading operators example 
#include <iostream> 
using namespace std; 

class CVector { 
    public: 
    int x,y; 
    CVector() {}; 
    CVector (int,int); 
    CVector operator + (CVector); 
}; 

CVector::CVector (int a, int b) { 
    x = a; 
    y = b; 
} 

CVector CVector::operator+ (CVector param) { 
    CVector temp; 
    temp.x = x + param.x; 
    temp.y = y + param.y; 
    return (temp); ***// Isn't object temp be destroyed after this function exits ?*** 
} 

int main() { 
    CVector a (3,1); 
    CVector b (1,2); 
    CVector c; 
    c = a + b; ***// If object temp is destroyed, why does this assignment still work?*** 
    cout << c.x << "," << c.y; 
    return 0; 
} 

답변

8

예제에서 개체 참조를 반환하지 않으면 값으로 개체를 반환하기 만하면됩니다.

개체 임시는 실제로 함수가 종료 된 후에 파괴되지만 그 시간까지 그 값은 스택에 복사됩니다.

4
CVector CVector::operator+ (CVector param) { 

이 줄이 외부 범위는 온도의 새로운 복사본을 가져옵니다 때,

CVector temp; 
    temp.x = x + param.x; 
    temp.y = y + param.y; 
    return (temp); 

을 CVector (객체 참조가 CVector& ...과 같을 것이다)의 독립적 인 복사본을 반환했다. 그래서 예 온도는 더 이상 우리와 함께하지 않지만 바깥 쪽 범위는 사본을 받게됩니다.

2

값으로 반환하므로 temp이 삭제되기 전에 복사됩니다.

1

값으로 반환됩니다.
이것은 값의 사본이 temp에서 만들어지고 리턴됨을 의미합니다.

참조로 개체를 반환하려면 반환 값 서명에 &이 있어야합니다.

2

컴파일러 최적화 후 개체가 반환 될 주소에 만들어집니다. 임시 객체는 스택에 생성되지 않습니다.> 그런 다음 복사하여 주소를 반환합니다.> 그런 다음 destory합니다.

+1

잠재적 인 최적화에 대해 이야기하는 것을 피할 것입니다. 중요한 점은 함수가 (return 문에서) 완료되기 전에 * 의미 상 * 객체가 반환 값 *에 복사된다는 것입니다. 해당 복사본이 최적화되어 있는지 여부는 구현 세부 사항입니다. –