2016-08-08 5 views
0

const 참조를 반환하여 혼동 스럽습니다.const 멤버를 참조하는 정의 된 함수와 변수의 복사본을 반환합니다.

#include <vector> 
#include <iostream> 

struct A 
{ 
    int dataSize; 
    std::vector<char> data; 
}; 

class T 
{ 
public: 
    T(); 
    ~T(); 
    const A& GetData(); 
private: 
    A dataA; 
}; 

T::T() : dataA{1} 
{ 
} 

T::~T() 
{ 
} 

const A& T::GetData() 
{ 
    return dataA; 
} 

void main() 
{ 
    T t; 
    A dataReceivedCpy = {}; 
    dataReceivedCpy = t.GetData(); 

    const A& dataReceivedRef = t.GetData(); 
    std::cout << dataReceivedRef.dataSize << std::endl; 
} 

을 정확히 어떻게 내가

dataReceivedCpy = t.GetData(); 

이 정확를 호출 할 때 : 나도 같은를 찾을 수 없습니다로 아마이 이미 논의 된, 그러나의는 다음 코드를 보자? 내 관점에서 볼 때 요청한 구조체의 복사본이 만들어 졌다고합니다. 맞습니까? 한편

,

const A& dataReceivedRef = t.GetData(); 

는 T 오브젝트가 파괴되지 않는 것이 정확 부재를 개체에 대한 참조를 반환한다. 내가 맞습니까?

+0

간단히't.getData()'에서 직접 생성하지 않고'dataReceivedCpy'를 기본 생성하고 할당하는 이유가 있습니까? 즉,'A dataReceivedCpy {t.getData()};' –

+0

아니요, 단지 설명과 데모 용입니다. (위 코드는 getData가 호출되는 다른 클래스의 멤버 인 dataReceivedCpy입니다.) – Dom

답변

0

예, 이해가 정확합니다.

dataReceivedCpy = t.GetData(); 

dataReceivedCpyt.dataA의 사본을 넣어 복사 할당 연산자를 호출합니다.

const A& dataReceivedRef = t.GetData(); 

에는 복사를하지 않고, dataReceivedReft.dataA에 대한 참조를합니다. 유효 기간은 t입니다.

+0

확인해 주셔서 감사합니다. :-) – Dom