연산자 오버로딩
2021. 12. 27. 22:51ㆍProgramming Language/.Cpp
12월 27일, "뇌를 자극하는 C++ STL" 학습 시작.
아래는 멤버함수를 이용한 연산자 오버로딩의 코드이다.
#include <iostream>
using namespace std;
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+(const Point& arg)
{
Point pt;
pt.x = this->x + arg.x; // this == p1, arg == p2.
pt.y = this->y + arg.y;
return pt; //point 형을 반환
}
const Point operator*(const Point& arg)
{
Point pt(1, 1);
pt.x = this->x * arg.x; // this == p1, arg == p2.
pt.y = this->y * arg.y;
return pt; //point 형을 반환
}
const Point operator++ () //전위 증가 연산자
{
++x;
++y;
return *this; //증가한 x와 y값을 가진 이 Point 객체를 반환한다.
}
const Point operator++ (int) //후위 증가 연산자
{
Point pt(x, y);
++x; // 내부 구현이므로 멤버 변수는 전위 연산을 사용해도 무방하다
++y;
return pt;
}
// 이항 연산자 구현
bool operator == (const Point& arg) const
{
return x == arg.x && y == arg.y ? true : false;
}
bool operator != (const Point& arg) const
{
return !(*this == arg);
}
};
int main() {
Point p1(2, 3), p2(5, 5);
Point result;
result = p1 + p2; // p1.operator+(p2); 와 같다. Point형 변수 p1이 가진 '+' operator method를 실행한다.
result.Print(); //method 수행
result = p1.operator+(p2); //컴파일러가 p1의 method로 const Point operator+(p2)를 수행
result.Print(); // 직접 입력한 연산을 출력
result = ++p1;
result.Print();
result = p2++; // result = p2를 저장
p2.Print(); // p2 = p2 + 1;을 저장
result.Print();
result = p1 * p2; // p1.operator*(p2); p1은 operator가 this로 호출하고, p2는 arg로 호출한다.
result.Print(); // (++p1) * (p2++) 을 출력
if (p1 == p2) cout << "p1 and p2 is same" << endl;
else cout << "not same" << endl;
//result = (p1 = p2); // p1.operator=(p2);
//result.Print();
}
책에 쓰여있기로, friend 함수를 이용해 전역 함수 오버로딩 시 객체의 프라이빗 멤버에 접근하는 방법도 있다.
그러나, friend와 같은 경우 데이터의 캡슐화를 저해하므로 객체의 멤버에 접근해 가져오는 GetX(), GetY()와 같은 getter을 사용하길 권장하고 있다.
'Programming Language > .Cpp' 카테고리의 다른 글
[C++ STL과 알고리즘] 벡터의 merge sort 공부하기 (0) | 2022.01.13 |
---|---|
[C++] BOJ 1026번 : 보물 (0) | 2022.01.09 |
[C++] 1.10 선언과 정의 (0) | 2021.03.17 |
[C++] 1.5 함수와의 첫 만남 - 인풋을 저장해 계산하기 (0) | 2021.03.17 |
[C++] 1.4 입출력 스트림 (0) | 2021.03.17 |