Home Effective C++ - Item.10
Post
Cancel

Effective C++ - Item.10

대입 연산자는 *this의 참조자를 반환하게 하자


내용

대입 연산자의 반환 값

C++의 대입 연산은 여러 개가 사슬처럼 엮일 수 있는 성질을 가지고 있다.

1
2
int x, y, z;
x = y = z = 15;   // 대임이 사슬처럼 이어진다.

대입 연산이 가진 또 하나의 특성은 바로 우측 연관(right-associative) 연산이라는 점이다.

1
x = ( y = ( z = 15));

위와 같이 대입 연산이 사슬처럼 엮이려면 대입 연잔자가 좌변 인자에 대한 참조자를 반환하도록 구현되어 있을 것이다. 이러한 구현은 일종의 관예(convention)인데, 이는 프로그래머가 만드는 클래스에 대입 연산자가 혹시 들어간다면 이를 따르는 것이 좋다.

1
2
3
4
5
6
7
8
9
10
class Widget {
 public;
  ...
  // 반환 타입은 현재의 클래스에 대한 참조자 이다.
  Widget& operator=(const Widget& rhs) {
    ...
    return *this;   // 좌변 객체(의 참조자)를 반환한다.
  }
  ...
};

‘좌변 객체의 참조자를 반환하게 만들자’ 라는 규약은 위의 단순 대입형 연산자 말고도 모든 형태의 대입 연산자에서 지켜져야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Widget {
 public;
  ...
  // +=, -+, *= 등에도 동일한 규약이 적용된다.
  Widget& operator+=(const Widget& rhs) {
    ...
    return *this;
  }

  // 대입 연산자의 매개변수 타이이 일반적이지 않을 때도 동일한 규약을 적용한다.
  Widget& operator=(int rhs) {
    ...
    return *this;
  }
  ...
};

이와 같은 관례를 따르지 않아도 컴파일이 안된다거나 에러를 발생하지는 않는다. 하지만 이 관례는 모든 기본제공 타입들이 따르고 있을 뿐만 아니라 표준 라이브러리에 속한 모든 타입에서도 따르고 있다는 점은 무시할 수 없을 것이다.

요점

대입 연산자는 *this의 참조자를 반환하도록 만들자!



참고. Effective C++ 3/E - Scott Meyers


This post is licensed under CC BY 4.0 by the author.