2017-04-19 11 views
0

, 할당 연산자는 다음 형태 중 하나를 가질 수언제 할당 연산자가 const T &, T & or T를 반환해야합니까? 이 <a href="http://www.cplusplus.com/articles/y8hv0pDG/" rel="nofollow noreferrer">article</a> 따르면

(1) MyClass& operator=(const MyClass& rhs); 
(2) MyClass& operator=(MyClass& rhs); 
(3) MyClass& operator=(MyClass rhs); 
(4) const MyClass& operator=(const MyClass& rhs); 
(5) const MyClass& operator=(MyClass& rhs); 
(6) const MyClass& operator=(MyClass rhs); 
(7) MyClass operator=(const MyClass& rhs); 
(8) MyClass operator=(MyClass& rhs); 
(9) MyClass operator=(MyClass rhs); 
  • 폼 (2), (5), (8) 낙담 할당 연산자 수정하지 않아야하기 때문에 그것 매개 변수. 이것이 필요한 경우를 생각할 수 없습니다.
  • 양식 (3), (6) 및 (9)는 복사 스왑 이디엄에 유용합니다.
  • 필자는 (7) - (9)는 const 개체 (구성 후 변경되지 않음)에만 사용해야한다고 생각합니다. 그 맞습니까?

내 질문은 : 나는 어떤을 사용해야하는 경우 유형 MyClass, MyClass & 또는 const MyClass &을 반환?

+0

(2), (5), (8)은 "이동 의미론"과 같은 것을 구현하는 데 필요합니다. – Scheff

+2

[이 정규 지정 연산자 참조] (http://en.cppreference.com/w/cpp/language/operators#Assignment_operator) : "정규 복사 할당 연산자는 ... 참조로 lh를 반환 할 예정입니다." . 또한 * copy * 대입 연산자는 rhs를 수정해서는 안되기 때문에 상수에 대한 참조가되도록해야합니다. 값으로 전달하는 것은 때로는 유용 할 수 있지만 (이전에 링크 된 참조 에서처럼) 유용 할 수 있습니다. –

+2

@Scheff 아니, 당신은'operator = (MyClass &&)'를 생각하고있다. 질문은'operator = (MyClass &)'입니다. – hvd

답변

1

실제로 구형이 아니지만 잘못되었습니다. 대입 연산자 (멤버 operator=)는 클래스 유형 자체뿐만 아니라 여러 유형에 대해 오버로드 될 수 있으며 반환 유형은 전혀 제한되지 않습니다.

스타일에있어 객체에 대한 비 const 참조를 반환하는 것은 내장 유형과의 일관성을 유지하는 데 일반적으로 사용되지만 개인적으로는 void을 선호합니다. 따라서 a=b && c=d에서와 같이 할당 표현식을 하위 표현식으로 사용하는 것은 거의 불가능합니다. 나는 이것을 이점으로 생각한다.

주석 노트에서 C++ 11은 이동 작업을 추가 했으므로 void MyClass::operator=(MyClass&&)이 사용자에게 유익한 지 여부를 고려해야합니다.