[C++] 연산자 오버로딩
REF : 윤성우의 열혈 C++
연산자 오버로딩
연산자 오버로딩을 통해 연산자의 기본기능 이외에 다른 기능을 추가할 수 있다.
- C++이 제시하는 언어의 패러다임은,
객체도 완벽히 기본 자료형처럼 다룰 수 있게한다.
이다. - 객체를 이루는 요소는 멤버변수, 함수이다.
연산자 오버로딩
을 통해 객체간 연산의 행동을 정의해줘야한다.+
연산자 오버로딩은 컴파일 타임에.opeartor+
로 해석된다.멤버함수에 의한 연산자 오버로딩
이전역함수에 의한 연산자 오버로딩
보다 우선순위가 높다.
오버로딩 규칙
- 오버로딩이 불가능한 연산자
c++의 문법 규칙을 유지하기위해 아래 연산자는 오버로딩이 불가능.
. 멤버접근 연산자
.* 멤버 포인터 연산자
:: 범위지정 연산자
?: 조건 연산자(3항 연산자)
sizeof 바이트 단위 크기 계산
typeid RTTI 관련 연산자
static_cast 형변환 연산자
dynamic_cast 형변환 연산자
const_cast 형변환 연산자
reinterpret_cast 형변환 연산자
- 멤버함수 기반으로만 오버로딩이 가능한 경우
객체를 대상으로해야만 의미가 있는 연산자들
= 대입 연산자
() 함수 호출 연산자
[] 인덱스 연산자
-> 멤버 접근을 위한 포인터 연산자
단항 연산자의 오버로딩
- 증감연산자는 대표적인 단항연산자이다.
- 단항연산자의 피연산자는 호출한 객체하나이다.
- 단항연산자의 오버로딩은 2가지로 나뉜다.
-
멤버함수에 의한 오버로딩
객체의 멤버함수가 호출되는 형태이다.
obj.operator++();
-
전역함수에 의한 오버로딩
전역함수는 피연산자가 모두 인자로 전달된다.
operator++(obj);
-
- 어떤 함수에 의한 오버로딩이든, ++(++num)같은 연산을 하기 위해선 단항연산자도 참조값을 반환해야한다.
전위연산, 후위연산의 구분
C++에서는 전위연산 후위연산의 구분 규칙을 아래와 같이 하고있다.
++pos -> operator++();
pos++ -> operator(++)(int);
--pos -> operator--();
pos-- -> operator(--)(int);
- int는 키워드이지 매개변수가 아니다.
- 후위증가의 효과를 나타내기 위해선 피연산된 객체를 변화시키되 복사된 const
임시객체
를 리턴해야한다.
C++에서의 후위연산
C++에서는 단일 자료형에 대해 연속적인 후위연산이 불가능하다.
int num = 100;
(num++)++;
이런 연산은 컴파일 에러를 발생시키는데, 위의 후위연산도
const 임시객체
를 반환하므로, 첫번째 후위연산은 가능하나, 2번째는 const로 선언되어 불가능하다.
교환법칙 문제
곱셈과 덧셈은 A * B = B * A 와같은 교환법칙이 성립하는 연산이다.
Point operator*(int times)
{
Point pos(xpos * times, ypos * times);
return (pos);
}
- 하지만 이처럼 곱셈 연산자를 오버로딩하면 교환법칙을 구현할 수 없다.
- 교환법칙이 성립하기 위해선 전역함수의 형태로 오버로딩해야한다.
Point operator*(int times, Point& ref) { Point pos(xpos * times, ypos * times); return (pos); } 또는 Point operator*(int times, Point& ref) { return (ref * times); }
입출력 오버로딩
- iostream 으로 사용하는
std::cin, std::cout, std::endl
모두 객체이다. - 이 객체들은 각각 «, » 등 연산자에 대해 오버로딩되어있다.
- 이 연산자 오버로딩들은 연속된 출력, 입력을 위해 출력이후 객체 자신의 참조값을 리턴하도록 되어있다.
객체를 출력가능하게끔 하려면 이 연산자들을 오버로딩해야한다.
단, 이 연산자를 오버로딩하는 주체를 잘 알아야한다.
객체의 출력을 오버로딩하기 위해선 출력하는 객체인 std::cout
를 오버로딩해야한다.
- 멤버함수에 의한 오버로딩을 하려면 클래스를 직접 수정해야하지만, 이는 불가능하다.
따라서 전역함수에 의한 오버로딩만 가능하다.
댓글남기기