연산자 오버로딩

2021. 12. 27. 22:51Programming 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을 사용하길 권장하고 있다.