2011-07-31 2 views
10

이 질문은 어딘가에있을만큼 기본적인 것 같지만 그 답을 찾을 수없는 것 같습니다. 가정하자오브젝트 및 대입 연산자에 대한 참조 선언하기

이 코드를 가지고 :

//class member function 
std::map< std::string, std::string > myMap; 

const std::map< std::string, std::string >& bar() 
{ 
    return myMap; 
} 

void myFunc(std::map< std::string, std::string >& foo1) 
{ 
    foo1 = bar(); 
    std::map< std::string, std::string >& foo2 = bar(); 
} 

나의 이해는 내가에서는 foo2 무엇 막대와 같은 인스턴스에 대한 참조()가 반환이기 때문에,에서는 foo2를 사용하기 시작하면, 나는에서는 foo2와 함께 할 아무것도 될 것입니다 myMap에 반영됩니다. 하지만 foo1은 어떨까요? foo1은 myMap의 복사본을 얻는가, 또는 bar()가 반환하는 것과 같은 인스턴스를 가리키고 있는가? C++ 표준 라이브러리에 따르면 std :: map에 대한 대입 연산자는 요소를 복사하지만 그 다음에는 할당 연산자가 foo2의 선언에서 실제로 호출되지 않는다는 의미입니까?

감사합니다. (즉 map의 할당 연산자가하는 일이기 때문에)

답변

15

참조는 C++에서 다시 열 수 없습니다. 즉, 일단 초기화되면 다시 할당 할 수 없습니다. 대신, 모든 할당은 실제로 참조 된 객체를 포함합니다.

foo1 = bar(); 
std::map< std::string, std::string >& foo2 = bar(); 

, 코드에서 그래서 첫 번째 줄은 myFunc에 매개 변수로 전달 된 객체에 std::map::operator=를 호출합니다. 그 후에 foo1 스틸은 동일한 객체를 참조하지만 값 (예 : 어떤 요소가 보유하고 있는지)이 변경되었을 수 있습니다.

두 번째 줄은 이 아니고 지정이 있다는 것을 기억하십시오. 대신 초기화입니다. 반환 유형 막대는 실제로 std::map<std::string, std::string> const&이므로 std::map<std::string, std::string>&에 바인딩 할 수 없으므로 컴파일 오류입니다. 사물의 '철학적'측면에서 확장하려면


은 C++ 참조는 가능한 한 투명하게 설계되어 정말 개체로하지 존재 않습니다. 이것은 용어의 C++ 표준 의미를 사용합니다 (OOP와 관련이 없음). 즉, 참조 유형이 이 아니고이 크기를 의미합니다. 대신 sizeof(T&) == sizeof(T). 마찬가지로, 참조에는 주소가 없으므로 포인터에 대한 참조 또는 참조에 대한 참조를 구성 할 수 없습니다. int& ref = i;, &ref == &i.

참조는 의도적으로 참조 된 객체가 사용되는 것처럼처럼 으로 사용되도록 의도 된 것입니다. 레퍼런스의 수명 기간 동안 발생하는 레퍼런스에만 해당되는 유일한 것은 레퍼런스의 바인딩 (binding)과 수명 (lifetime)의 의미입니다.

+0

+1 감사합니다. 새로운 것을 배웠습니다. 나는 방금 테스트를했고, 나는 정말로 절대적으로 100 % 틀렸고 당신은 맞습니다 = -) – flumpb

+0

좋습니다. 고마워, 내가 정말로 알아야 할 것은 대입 연산자가 foo1에서 호출되었고 foo2에서 호출되지 않았다는 것이다. 좋은 설명, 고마워! – bhh1988

+0

@Luc 가능한 경우 참조 변수가 일반적으로 사용되지 않는 이유는 무엇입니까?나는 그들이 무엇인지 (당신의 대답 덕택에) 더 잘 이해할 수 있지만, 코더들은 일반적으로 그것에 대한 조언을 선호한다. 이중화인가요? 제한된 범위? –

0

라인

foo1 = bar(); 

는 복사본을 만듭니다.

+0

글로벌 변수에 대한 참조를 반환하는 것이 이상하게 보입니까? –

+0

@ 0A0D : "global"변수가 실제로 외부 연결을 가지고 있지 않으면 캡슐화에 사용할 수 있습니다. 또는 전역 변수'a' 또는 전역 변수'b'에 대한 참조를 반환 할 수 있습니다. –

관련 문제