2011-04-12 3 views
0
class MyClass { 
    public: 
    ... 
    MyClass & operator=(const MyClass &rhs); // return MyClass& 
    ... 
    } 

왜 안C++ - 연산자가 * this 대신 * this에 대한 참조를 반환하는 이유는 무엇입니까?

class MyClass { 
    public: 
    ... 
    MyClass operator=(const MyClass &rhs); // return MyClass 
    ... 
    } 

이 경우 참조로 반환하는 것이 더 효율적이라는 이유인가?

감사합니다

// * 업데이트 *

나는 다음과 같이 나는 주된 이유를 찾은 것 같아 : 연산자의 반환 형식은 = MyClass에보다는 MyClass에있다

int i1, it2, i3; 
(i1 = i2) = i3; // i3 will be assigned to i1 

경우 &이면 다음 문은 내부 데이터 형식과 동일하게 수행되지 않습니다.

MyClass mc1, mc2, mc3; 

(mc1 = mc2) = mc3; 

내장 유형에 사용되는 규칙을 따르면 우수 사례로 간주됩니다.

// *** update *** 

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int i1, i2, i3; 

    i1 = 0; 
    i2 = 2; 
    i3 = 3; 

    (i1 = i2) = i3; 

    cout << "i1: " << i1 << endl; 
    cout << "i2: " << i2 << endl; 
    cout << "i3: " << i3 << endl; 

    return 0; 
} 

// output from VS2010 
/* 
i1: 3 
i2: 2 
i3: 3 
*/ 
+0

이 비슷한 질문을 참조하십시오 : (http://stackoverflow.com/q/2447696/478288) – chrisaycock

+0

아니,'i3'가 할당되지 않습니다 [C++에서 과부하 할당 연산자]를 'i1'. 사실이 동작은'(i1 = i2) = i3' 할당에서 정의되지 않습니다. – AnT

+0

@AndreyT : 내 update2를 참조하십시오. – q0987

답변

5

"왜 안된다"는 뜻은 무엇입니까? 그것은 당신에게 달려 있습니다. 원하는 경우 참조 대신 오브젝트의 사본을 리턴 할 수 있습니다. 실제로 효율성이 떨어지는 것을 제외하고는 아무 문제가 없습니다.

많은 경우 사람들은 내장 연산자 지정 연산자의 의미에 더 가깝기 때문에 참조를 반환하는 것을 선호합니다. 내장 된 운영자는 틀림이없는 매우 유용하지만, 여전히 그 좌변의 의미를 보존하려는 경우, 당신은에서 참조를 반환해야 당신이

int a, b = 0; 
int *p = &(a = b); 
// `p` now points to `a` 

같은 코드를 작성할 수 있다는 것을 의미 좌변 값을 반환하여 할당 연산자.

업데이트

업데이트 된 예는 올바르지 않습니다. (i1 = i2) = i3 표현은 정의되지 않은 동작으로 이어지고, "i3은 i1에 할당됩니다"가 아닌 것처럼 보입니다. 대입 연산자가 lvalue를 반환한다는 사실은 (i1 = i2) = i3과 같은 표현식을 컴파일하는 것을 허용한다는 것입니다. 그러나이 특정 표현식은 동작이 정의되어 있지 않으므로 쓸모가 없습니다.

(mc1 = mc2) = mc3 예제에서와 같이 사용자 정의 할당의 경우 동작은 정의되어 있지만 여전히 유용하지는 않습니다. 왜 그런 식으로하고 싶니?

1

operator =이 인수를 (const T&)으로받는 한 유효한 연산자 오버로딩입니다. 은 원하는 값을 반환 할 수 있습니다. 나는 연속 객체 복사를 방지하려는 경우 예를 들어 , 나는 즉시 당신이 오류가 발생합니다 x = y = z; 컴파일러을 시도로서,

void operator = (const T& copy) { } 

을 같은 연산자를 선언하지만, x = y;은 여전히 ​​유효합니다! 반환 값은 요구 사항을 기반으로합니다. 동일한 객체 또는 int 또는 char*을 반환 할 수있게하려면 원하는대로 선택하십시오.비 const 참조를 *this으로 반환하는 것은 널리 사용되는 규칙입니다.

+0

인수가 상수 참조 인 경우조차도 필요하지 않습니다 ... 인수는 'const'가 아니거나 비 const 참조 일 수도 있고 값으로 전달 될 수도 있습니다. 사실, 타입을 취하기 위해 자신 만의'operator ='를 정의 할 수 있습니다. ('T & operator = (T const &)'는 컴파일러가 암시 적으로 정의 할 것입니다. –

+0

두 번째 @David Rodriguez - dribeas의 요지 인, operator = (T)','?? 연산자 (T &)'또는'?? 연산자 = (T const &)' 그것은 인자가 const 참조가되어야한다는 잘못된 문장입니다. 사실 오버로드의 가장 좋은 방법은 연산자가 값으로 전달되는 인수를 필요로하는'복사 및 스왑 (swap) '메커니즘입니다. 이것을 읽으십시오 http://stackoverflow.com/questions/3279543 ​​/ what-is-the-copy-and-swap-idiom)을 입력하고 답을 수정하십시오. –

0

내 C++ 일은 오래 전에 사라졌지 만 구문을 사용하여 클래스의 임시 복사본을 만들지 않았습니까?

HTH

마리오

관련 문제