class Point
{
int x;
int y;
public:
Point(int _x=0, int _y=0) :x(_x), y(_y) {}
void print() const { cout << x << ',' << y << endl; }
const Point operator+(Point arg) const
{
Point pt;
pt.x = this->x + arg.x;
pt.y = this->y + arg.y;
cout << "operator 호출" << endl;
return pt;
}
};
int main()
{
Point p1(1, 1);
Point p2(2,2);
Point p3 = p1+p2;
p3.print();
}
c++은 객체끼리의 연산자를 지정해 정의하게 해주는 연산자 오버로딩을 지원한다.
아주 다양한 연산자를 오버로딩 할수 있는데 위의 코드의 +같은 사칙연산 외에도 ++,--,==,!= 등 거의 모든 연산자에 대해 정의할수 있다.
operator()를 이용하면 함수호출 처럼 만들어 낼수 있고 operator[](int index)를 이용해 객체를 배열처럼 표현하여 쓸수 있다.
또한 operator Type()을 이용하여 해당 객체의 타입변환을 정의할 수 있다.
class Point
{
int x;
int y;
public:
Point(int _x=0, int _y=0) :x(_x), y(_y) {}
void print() const { cout << x << ',' << y << endl; }
operator int()
{
return this->x;
}
};
int main()
{
Point p1(1, 1);
int X = p1;
printf("%d", X);
}
위의 코드는 Point 객체의 int타입으로의 변환을 정의해 준것이다.
연산자 오버로딩의 작동원리는 컴파일러가 위의 p1 + p2를 보고 p1.operator+(p2)로 바꾸어 준다.(첫번째 +연산자 코드 참조)
이러한 연산자 오버로딩은 객체끼리의 관계를 명확하게 표현하여 객체지향 설계에 더욱 다가가게 만들어 주는 좋은 도구인것 같다.
'언어 > C++' 카테고리의 다른 글
(C++)함수 호출 규약 (0) | 2020.07.13 |
---|---|
(C++)함수 포인터와 콜백함수 (0) | 2020.07.13 |
(C++)타입변환 연산자 오버로딩 (0) | 2020.07.02 |
(C++)VS에서 함수에서 지역변수의 레퍼런스값 리턴시 접근할수 있는 이유 (0) | 2020.06.29 |
(C++)함수에서의 const 사용 (0) | 2020.06.29 |