#include <iostream>
#include<iomanip>
using namespace std;
//연산자 오버로딩(Operator Overloading)
//연산자 vs 함수
//- 연산자는 피연산자의 개수/타입이 고정되어 있음
//연산자 오버로딩?
//일단 [연산자 함수]를 정의해야함
//함수도 멤버함수 vs 전역함수가 존재하는 것 처럼, 연산자 함수도 두가지 방식으로 만들 수 있음
//멤버 연산자 함수 version
//-- a op b 현태에서 왼쪽을 기준으로 실행됨(a가 클래스여야 가능. a를 '기준 피연산자' 라고함)
//---b는 클래스나 변수가 들어갈 수 있다.
//--한계) a가 클래스가 아니면 사용 못함
//전역 연산자 함수 version
//--a op b 형태라면 a, b 모두를 연산자 함수의 피연산자로 만들어준다
//그럼 무엇이 더 좋은가? 그런거 없음. 심지어 둘 중 하나만 지원하는 경우도 있기 때문
//-대표적으로 대입 연산자(a=b)는 전역 연산자 version으로는 만들지 못함
//복사 대입 연산자
//-대입 연산자가 나온 김에 [복사 대입 연산자]에 대해 알아보자
//용어가 좀 헷갈린다 [복사 생성자] [대입 연산자] [복사 대입 연산자] ???
//-복사 대입 연산자 = 대입 연산자 중, 자기 자신의 참조 타입을 인자로 받는 것
//기타
//-모든 연산자를 다 오버로딩 할 수 있는 것은 아니다(:: . .* 이런건 안됨)
//-모든 연산자가 다 2개 항이 있는 것은 아님. ++ -- (단항 연산자)
//-증감 연산자 ++ --
//--전위형 (++a) operation++()
//--후위형 (a++) operation++(int)
//멤버 연산자 함수 version
class Position {
public:
Position operator+(const Position& arg) {
Position pos;
pos._x = _x + arg._x;
pos._y = _y + arg._y;
return pos;
}
bool operator==(const Position& arg) {
return _x == arg._x && arg._y == arg._y;
}
//대부분 void보다는 자기 자신의 Ref값을 리턴해줌
Position& operator=(int arg) {
_x = arg;
_y = arg;
//Position* this = 내 자신의 주소;
return *this;
}
//복사 대입 연산자가 특별 대우를 받는 이유
//말 그대로 객체가 복사 되길 원하는 특징 때문
//어떤 값을 참고만하고자 하는 함수 이므로 const를 붙여줘야함
//즉 안에 포인터 값을 조작할 수 없는 const Position& 을 받아야함
Position& operator=(const Position& arg) {
_x = arg._x;
_y = arg._y;
//Position* this = 내 자신의 주소;
return *this;
}
//전위형
//전위형의 경우 연속적으로 호출 가능
//따라서 반환값을 지정해주는 것이 좋다.
Position& operator++() {
++_x;
++_y;
return *this;
}
//후위형
//증감되기 전 값을 반환해줘야하는 경우가 생길 수 있다
//미리 원래 값을 복사하여 반환하는 형식으로 만들자
Position operator++(int) {
Position ret = *this;
_x++;
_y++;
return ret;
}
public:
int _x;
int _y;
};
//전역 연산자 함수 version
Position operator+(int a, const Position& b) {
Position ret;
ret._x = b._x + a;
ret._y = b._y + a;
return ret;
}
int main()
{
Position pos;
pos._x = 0;
pos._y = 0;
Position pos2;
pos._x = 1;
pos._y = 1;
Position pos3 = pos + pos2;
Position pos4 = pos.operator+(pos2);
Position pos5 = 1 + pos2;
bool isSame = (pos == pos2);
pos5 = 5;
pos++;
++pos;
pos5 = ++pos;
//(const Pos&)를 줘
//후위 연산자는 복사값을 주고있다
//임시적으로 pos값을 저장한 다음에 그 복사본의 참조값을 pos5에게 건내주어
//복사대입연산자가 실행된 것!
pos5 = pos++;
pos5.operator++(1);
}