C++ operate연산자 오버라이딩.md!
연산자 오버라이딩
개발 편의를 위해 생성된 인스턴스끼리, 혹은 인스턴스와 다른 변수간 연산자를 통해 연산할 수 있도록 하는것.
Point라는 클래스 안에 int형 변수 x, y가 있고 point1과 point2 간 덧셈연산 혹은 곱셈 등 각종 연산을 하고 싶을때 연산자 오버로딩을 통해 가능하다.
Point pos1(3,4);
Point pos2(10,20);
Point pos3 = pos1+pos2;
’+’ 연산자를 오버로딩하면 위처럼 사용할 수 있다!
연산자 오버라이딩 방법은 2가지가 있다.
클래스 맴버 함수로 정의 하거나 클래스 밖에 정의하고 friend 키워드와 같이 사용하거나.
밖에다 정의한 경우
friend Point operator+(const Point &pos1, const Point &pos2);
안에다 정의한 경우
Point& Point::operator-()
위에는 Point pos3 = pos1-pos2;
처럼 사용하기 위해 정의한 -연산자 오버라이딩
아래는 Point pos3 = pos1+pos2;
처럼 사용하기 위해 정의한 +연산자 오버라이딩
사용법은 같지만 어디에 선언하느냐에 따라 코딩이 달라진다.
맴버 함수로 정의해서 사용하는게 friend때문에 2번 키보드 칠 일이 없기 때문에 알기도 쉽고 간단하다(코드 길이만 봐도 클래스 안에 정의한게 더 짧음).
하지만 꼭 밖에 선언해야 하는 경우가 있는데 iostream객체의 cout과 cin연산자를 오버라이딩할 경우다.
friend ostream& operator<<(ostream& os, const Point& pos);
friend istream& operator>>(istream& is, Point& pos)
#include <iostream>
using namespace std;
class Point
{
private:
int xpos, ypos;
public:
Point(int x=0, int y=0) : xpos(x), ypos(y)
{}
void ShowPosition() const
{
cout<<"["<<xpos<<","<<ypos<<"]"<<endl;
}
void operator+=(const Point &pos1) //pos1+=pos2; --> pos1=pos1+pos2
{
xpos += pos1.xpos;
ypos += pos1.ypos;
}
void operator-=(const Point &pos1)
{
xpos -= pos1.xpos;
ypos -= pos1.ypos;
}
Point& operator-()
{
xpos=-xpos;
ypos=-ypos;
return *this;
}
Point& operator++()
{
xpos++;
ypos++;
return *this;
} //전위 증가
const Point operator++(int)
{
const Point refobj(xpos, ypos); //복사본 생성
xpos++;
ypos++;
return refobj; //반환받을 한 라인에서만 사용하고 사라질 복사본 반환 const로
} //후위증가
friend Point operator+(const Point &pos1, const Point &pos2);
friend Point operator-(const Point &pos1, const Point &pos2);
friend bool operator==(const Point &pos1, const Point &pos2);
friend bool operator!=(const Point &pos1, const Point &pos2);
friend Point& operator~(Point &pos);
friend Point& operator--(Point& ref);
friend const Point operator--(Point& ref, int);
friend Point operator*(int times, Point& ref);
friend Point operator*(Point& ref, int times);
friend ostream& operator<<(ostream& os, const Point& pos);
friend istream& operator>>(istream& is, Point& pos)
;
};
Point operator+(const Point &pos1, const Point &pos2) //기존의 point 값이 변하지 않도록 const키워드를 붙이는것 이 중요하다.
{
Point pos(pos1.xpos+pos2.xpos, pos1.ypos+pos2.ypos);
return pos;
}
Point operator-(const Point &pos1, const Point &pos2)
{
Point pos(pos1.xpos-pos2.xpos, pos1.ypos-pos2.ypos);
return pos;
}
bool operator==(const Point &pos1, const Point &pos2)
{
if(pos1.xpos == pos2.xpos && pos1.ypos == pos2.ypos)
{
return true;
}
else
{
return false;
}
}
bool operator!=(const Point &pos1, const Point &pos2)
{
if(pos1.xpos == pos2.xpos && pos1.ypos == pos2.ypos)
{
return false;
}
else
{
return true;
}
}
Point& operator--(Point& ref)
{
ref.xpos--;
ref.ypos--;
return ref;
} //전위 증가
const Point operator--(Point& ref, int)
{
const Point refobj(ref); //복사본 생성
ref.xpos--;
ref.ypos--;
return refobj; //반환받을 한 라인에서만 사용하고 사라질 복사본 반환
}
Point& operator~(Point &pos)
{
int temp=pos.xpos;
pos.xpos = pos.ypos;
pos.ypos = temp;
return pos;
}
//교환법칙
Point operator*(int times, Point& ref) //int형*point형
{
Point pos(ref.xpos*times, ref.ypos*times);
return pos;
}
Point operator*(Point& ref, int times) //point형*int형
{
Point pos(ref.xpos*times, ref.ypos*times);
return pos;
}
//전역함수로 cout<<pos 가능하게 만들기 os가 cout클래
ostream& operator<<(ostream& os, const Point& pos)
{
os<<'['<<pos.xpos<<','<<pos.ypos<<']'<<endl;
return os;
}
istream& operator>>(istream& is, Point& pos) //값을 집어넣어야 하기때문에 const를 뺴야함
{
is>>pos.xpos>>pos.ypos;
return is;
}
int main()
{
Point pos1(3,4);
Point pos2(10,20);
Point pos3 = pos1+pos2;
pos1.ShowPosition();
pos2.ShowPosition();
pos3.ShowPosition();
pos3=pos2-pos1;
pos3.ShowPosition();
pos3+=pos1;
pos3.ShowPosition();
pos3-=pos2;
pos3.ShowPosition();
Point pos4(1,1);
if(pos3==pos4)
{
cout<<"같습니다"<<endl;
}
pos4=pos1+pos2;
if(pos3!=pos4)
{
cout<<"같지 안습니다."<<endl;
}
pos4=-pos4;
pos4.ShowPosition();
pos4=-pos4;
pos4.ShowPosition();
pos4=~pos4;
pos4.ShowPosition();
cout<< "---------------------------------"<<endl;
(++(++pos1)).ShowPosition();
cout<< "전위끝"<<endl;
pos1.ShowPosition();
pos1++.ShowPosition(); //후위증가는 Pointer&전달한게 아니기 때문에
pos1.ShowPosition();
Point cpy = pos1*3;
cpy.ShowPosition();
cpy = pos1*3;
cpy.ShowPosition();
cin>>cpy;
cout<<cpy;
cpy=pos1;
cpy.ShowPosition(); //디폴트 대입연산자 생성&호출
}