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를 붙이지 않는 참조형으로 반환해야 한다.

라이브러리를 만든다는것은 정말 쓸모 없는 재발명일수도 있지만, 배우는 입장에서는 무척이나 좋은 경험같다.

프로그래밍 ,

Trackback Address:http://poksion.cafe24.com/poklog/trackback/57
  1. Blog Icon
    skrmsp

    Effective C++ 3판, 항목10(대입 연산자는 *this의 참조자를 반환하게 하자)에 같은 내용이 나옵니다.
    항목11 (operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자)도 중요한 내용이죠.

  2. Blog Icon

    감사합니다. 확인해보니 const 가 아닌 그냥 참조형으로 리턴하는 이유에 대해서도 아주 잘 설명되어 있더군요( a=a 문제가 아니라 (a=b)=c 문제였습니다.)