개발/C, C++

[C++] 단항 연산자 오버로딩

huiyu 2019. 1. 3. 05:30

대표적인 단항 연산자

 - 1 증가 연산자 : ++
 - 1 감소 연산자 : --


++pos;

-> operator++()의 함수형태로 오버로딩 되어 있다.


멤버함수인 경우 operator++()의 형태, 전역함수의 경우 operator++(Point& ref)의 형태이다.

아래와 같이 구현되어있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Point& operator++()
{
  xpos+=1;
  ypos+=1;
  return *this;
}
 
Point& operator--()
{
  xpos-=1;
  ypos-=1;
  return *this;
}
 
cs

-> this는 객체 자신의 포인터 값을 의미한다. 즉, 위 함수에서 객체 자신을 참조형으로 반환한다. 그렇기 때문에 객체 자신의 복사본을 만들어 반환하게 된다. 그래서 아래의 형태도 가능하게 된다.

++(++pos);

괄호 안의 ++연산자를 먼저 한후 자신의 참조형을 반환, 참조된 값을 통해 다시 ++연산자를 진행하게 된다.

정리하면, 위 예제의 operator++함수에서 객체 자신을 참조할 수 있는 참조값을 반환하는 이유는 일반적인 ++연산자처럼 아래의 연산이 가능하게 함이다.

++(++pos), --(--pos)


* ++와 --연산자는 피연산자의 위치에 따라 '전위증가'와 '후위증가로 나뉘게 된다. 연산자 오버로딩 할 경우 이를 구분할 수 있는 방법은?

-> C++에서는 전위 및 후위 연산에 대한 해석 방식에 대해 다음과 규칙을 정해놓고 있다.

   ++pos -> pos.operator++();
   pos++ -> pos.operator--(int);

   --pos -> pos.operator--();
   pos-- -> pos.operator--(int);

 즉, 키워드 'int'를 통해 후위 연산에 대한 함수를 전위연산에 대한 함수와 구분하고 있다. 여기서 int는 단지 후위연산을 구분하기 위한 목적으로 선택된 것일뿐, int형 데이터를 인자로 전달하는 것과는 전혀 상관이 없다.


[참고자료]

윤성우 열혈 C++ 프로그래밍 10-2 단항 연산자의 오버로딩



728x90
반응형