operator=
2007/08/24 18:12
개인적으로 연산자 오버로딩을 무지 싫어하나 이것들이 잘 구현된 라이브러리들은... 역시 편하다-_-
end의 행렬클래스도 연산자 오버로딩을 하려고, 다른 행렬클래스들을 살펴보았는데, 허걱.=이 붙은 계열의 오버로딩은 모두 참조를 리턴하는게 아니던가! 궁금하던 차에 사수격인 회사동료분께 물어봤더니, 아주 명쾌한 해설을 해주셨다.
operator=를 오버로딩해서 호출이 되면, lhs = rhs 꼴은 lhs.operator=(rhs) 형태로 된다. 만일 a=b=c를 수행한다고 하면, a.operator=( (b.opeator=(c) ) 가 된다. 그런데, a=b=c 는 Primative Type을 기준으로 a는 b와 같은 값이 되어야 하고 그렇게 되기 위해서 b.operator=(c)는 b를 참조형으로 던져야 한다. 또한 a = a (a=b)=c일 경우도 있을수 있으므로(멍청하게 저렇게 쓰지는 않겠지만, 참조형으로 엮여서 저렇게 된다는지) const를 붙이지 않는 참조형으로 반환해야 한다.
라이브러리를 만든다는것은 정말 쓸모 없는 재발명일수도 있지만, 배우는 입장에서는 무척이나 좋은 경험같다.
end의 행렬클래스도 연산자 오버로딩을 하려고, 다른 행렬클래스들을 살펴보았는데, 허걱.=이 붙은 계열의 오버로딩은 모두 참조를 리턴하는게 아니던가! 궁금하던 차에 사수격인 회사동료분께 물어봤더니, 아주 명쾌한 해설을 해주셨다.
operator=를 오버로딩해서 호출이 되면, lhs = rhs 꼴은 lhs.operator=(rhs) 형태로 된다. 만일 a=b=c를 수행한다고 하면, a.operator=( (b.opeator=(c) ) 가 된다. 그런데, a=b=c 는 Primative Type을 기준으로 a는 b와 같은 값이 되어야 하고 그렇게 되기 위해서 b.operator=(c)는 b를 참조형으로 던져야 한다. 또한 a = a (a=b)=c일 경우도 있을수 있으므로(멍청하게 저렇게 쓰지는 않겠지만, 참조형으로 엮여서 저렇게 된다는지) const를 붙이지 않는 참조형으로 반환해야 한다.
라이브러리를 만든다는것은 정말 쓸모 없는 재발명일수도 있지만, 배우는 입장에서는 무척이나 좋은 경험같다.
Trackback Address:http://poksion.cafe24.com/poklog/trackback/57
Effective C++ 3판, 항목10(대입 연산자는 *this의 참조자를 반환하게 하자)에 같은 내용이 나옵니다.
항목11 (operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자)도 중요한 내용이죠.
감사합니다. 확인해보니 const 가 아닌 그냥 참조형으로 리턴하는 이유에 대해서도 아주 잘 설명되어 있더군요( a=a 문제가 아니라 (a=b)=c 문제였습니다.)