2010-05-28 4 views
3

은의이 두 기능을 논의하자함수가 참조 또는 객체를 반환해야합니까?

  1. 복잡한 & 연산자 + = (const를 T & 발을);
  2. 복합물 연산자 + (const T & val);

"complex"는 예를 들어 복잡한 변수를 구현하는 클래스의 이름입니다.

따라서 첫 번째 연산자는 + = b + = c (b = b + c; a = a + b;와 동일 함)를 쓸 수 있도록 참조를 반환합니다.

두 번째 연산자 returnes 및 objec (NOT REFERENCE)는 여전히 a = b + c + d로 쓸 수 있습니다.

누가이 뉘앙스를 설명 할 수 있습니까? 반환 참조 또는 개체의 차이점은 무엇입니까?

(a += b) += c; 

a에 모두 bc을 추가합니다 :

답변

1

1에서 a + = b, + = 연산자는 a를 수정합니다. 따라서 자체가 조작의 올바른 결과이기 때.에 자체에 대한 참조를 리턴 할 수 있습니다.

그러나 2. + b가 a가 아닌 것을 반환하기 때문에 2.에서 새로운 객체가 필요하므로 a에 대한 참조를 반환하면 올바르지 않습니다.

4

대입 연산자는 같은 개체에 여러 응용 프로그램을 지원합니다. 이를 위해 a += ba에 대한 참조를 반환해야합니다. 그러나 표현식 b + c + d에는 부작용이 없으므로 더하기 연산자에이 연산자가 필요하지 않습니다. a에 대한 최종 지정 만 부작용이 있습니다.

1

뉘앙스는 당신이주는 예제에 있습니다.

+ 연산자에서 시작한 두 값과 다른 값을 얻을 것으로 예상됩니다. b + c는 b 또는 c가 아닌 다른 값입니다. 따라서 우리는 b 또는 c에 대한 참조를 반환 할 수 없으며 스택 상에 새 객체를 할당하는 것보다 짧게 처리해야합니다. 따라서 우리는 가치를 반환해야합니다.

당신은 이미 + = 연산자가 그 결과를 반환하는 이유에 대해 이미 설명했습니다.

0

첫 번째 경우 왼쪽에있는 객체에 무언가를 추가하지만 표현식의 값은 왼쪽에있는 객체입니다. 그래서 당신은 참조로 뭔가 (보통 왼쪽)를 반환하고 있습니다. 예를 들어 두 번째 경우

cout << (a+=b) 

, 두 객체를 추가하고, 제 3 목적을 얻기하고 스택에서이 계산을 수행 할 수 있으므로 값보다는 참조하여 실제의 오브젝트를 반환되어있다. 예를 들어 : complex& operator+=(const T& val);this에서 작동하며 complex operator+(const T& val); 때문에 합계를위한 새로운 임시 개체를 만들어야합니다

if(...) 
{ 
    T a = b + c; 
    cout << a; 
} 
1

때문입니다. 당신이 +=에서 개체를 반환한다면

, 그것은 아마 당신이 무엇을 기대 할 것이지만, 거기에 약간의 추가 복사본이있을 수 있습니다. 언급 한 바와 같이 입니다. 체인 호출을 원할 경우이 동작이 필요합니다.임시로 반송하여 (a += b) += c이라고 작성한 경우 c의 추가는 임시로 소멸되면 손실됩니다.

+에서 참조를 반환하려는 경우 임시 참조가되어 프로그램에 정의되지 않은 동작이 발생합니다. b+c이 임시 b1을 만들고 b1 + d을 작성하여 b2을 생성 한 후 a에 할당하므로 a=b+c+d이라고 작성할 수 있습니다.

관련 문제