값으로 반환과 참조로 반환의 차이점은 무엇입니까?


대답 1:

당신은 기능입니다, 나는 기능입니다. 당신이 사과 소비자 기능이라고하겠습니다. 저는 사과 공급자 기능입니다. 내 사과를 저장 영역에 저장합니다. 저장 영역에는 행과 열이 있습니다 (또는 컴퓨터의 메모리 구조가 작동하는 방식을 모방 한 다른 체계적 구성표). 소비자는 사과를 원하므로 사과 공급 업체에 문의하십시오. 이를 위해 웹 사이트와 양식 (함수 인터페이스)이 있습니다. 내 기능이 가치로 돌아가려면 사과를 요청할 때 실제 사과를 보내면 원하는대로 할 수 있습니다. 내 기능이 참조로 돌아 오는 경우 사과를 보내지 않을 것입니다. 사과 보관 영역에 좌표 참조를 제공하여 사과를 가져 가거나 그 자리에서 먹을 수 있습니다.

가치로, 당신은 실제적인 것을 얻습니다. 참고로, 당신은 ... 물건에 대한 참조를 얻습니다.


대답 2:

반환 된 데이터 / 객체가 함수 범위에 정적으로 할당되었다고 가정합니다.

값으로 반환하면 데이터 / 객체의 복사본이 반환되므로 반환 된 개체의 복사본 생성자가 호출됩니다 (할당 생성자 "="를 사용할 때와 같은 복사본 생성자가있는 경우). 이 복사는 함수 범위 (오브젝트 수명 참조) 후에 반환 될 오브젝트가 삭제 (정의되지 않음)되므로 리턴 될 때 복사되어야하기 때문에 발생합니다. 호출자 범위 (예 : 기본)는 함수에서 객체 또는 데이터의 복사본을 가져옵니다.

예:

// val로 리턴
개 fooDog () {
    개 theDog ( "스쿠비"); // 정적으로 할당 된 Dog 객체
    theDog를 반환; // Dog 복사 생성자를 호출하여 호출자에게 전달합니다.
} // 여기서 개가 할당 해제되었습니다.

int main () {
    개 myDog = fooDog (); // fooDog에서 Dog 객체의 복사본을 가져옵니다.
    리턴 0;
}

참조에 의한 반환은 함수 호출자가 함수에서 데이터의 참조 또는 주소를 얻음을 의미합니다. 데이터가 정적으로 할당되어 함수 범위 이후에 소멸 될 경우이 개체의 참조가 "중지"되거나 다른 방법으로 유효하지 않은 개체를 참조합니다. 따라서 함수에서 정적으로 할당 된 객체에는 참조로 반환하지 않는 것이 좋습니다.

// 심판에 의한 반환
개와 fooDogRf () {
    개 theDog ( "스쿠비"); // 정적으로 할당 된 Dog 객체
    theDog를 반환; // theDog의 참조를 반환
} // 여기서 개가 할당 해제되었습니다.

int main () {
    개 myDog = fooDogRf (); // fooDogR 함수에서 Dog의 심판을 가져옵니다.
    myDog.Bark (); // bad_alloc에 ​​대한 예외
    리턴 0;
}

리턴 된 데이터 / 오브젝트가 동적으로 할당되었다고 가정하십시오. 객체 수명이 함수 범위에 구속되지 않기 때문에 참조에 의한 반환이 더 안전하므로 참조가 매달려 있지 않습니다. 그러나 우수한 C ++ 프로그래머는 동적으로 할당 된 객체를 정리하거나 할당 해제해야 할 책임이 있으므로 메모리 누수가 발생하지 않습니다.

개와 fooDogR () {
    개 * theDog = 새 개 ( "Gunner"); // dyn. alloc
    return * theDog;
}

void optA () {
    개 myDog = fooDogR ();
    myDog.Bark ();
    // 삭제 & myDog; // 동적으로 할당되기 때문에이 작업도 수행 할 수 있지만 오류가 발생합니다 (이중 할당 해제).
} // 내 강아지는 안전하게 할당 해제됩니다

void optB () {
    Dog * pDog = & (fooDogR ());
    pDog.Bark ();
    pDog 삭제; // pDog 할당 해제
}

솔직히, 나는 re로 돌아 오는 것이 무엇인지 모른다.

내 답변이 도움이 되었기를 바랍니다. 행복한 코딩.