연산자 오버로딩

이승덱·2021년 7월 21일

CPP

목록 보기
33/70
#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);

}
profile
공부 기록용 블로그입니다

0개의 댓글