본문 바로가기
Study/C++

[C++]연산자 중복(연산자 오버로딩)

by DawIT 2020. 12. 14.
320x100

연산자 중복이란 무엇인가?

연산자 중복은 C++ 에서 제공하는 기본적인 자료형들(예를 들어 int, double, float)말고 다른 클래스에도 연산자를 이용할 수 있도록 하는 문법이다.

 

string 클래스도 이미 연산자 중복이 적용되어 있다.

 

 

string은 + 연산자를 통해 s1과 s2를 이어붙이는 역할을 한다.

 

어떻게 작동하는가?

만약 내가 어떤 객체 v1, v2에 대해 v1 + v2라고 쓴다면, 컴파일러는 이를 v1.operator+(v2) 의 형태로 호출하여 반환값을 반환한다.

 

어떤 연산자에 대해 작동하는가?

+,-,++(전위, 후위),--(전위, 후위),=,==,[],* 등등 다양한 연산자를 오버로딩하여 사용할 수 있다.

 

예시)

#include <iostream>
#include <string>
using namespace std;

class Complex
{
	double r;
	double i;

public:
	Complex(double r,double i)
	{
		this->r = r;
		this->i = i;
	}

	Complex operator+(Complex &complex)
	{
		double r, i;

		r = this->r + complex.r;
		i = this->i + complex.i;

		Complex result(r, i);
		return result;
	}

	Complex& operator++()
	{
		++r;
		++i;
		return *this;
	}

	Complex operator++(int k)
	{
		Complex temp = { *this };
		(this->r)++;
		(this->i)++;
		return temp;
	}

	Complex& operator=(Complex &complex)
	{
		this->r = complex.r;
		this->i = complex.i;
		return *this;
	}

	bool operator==(Complex &complex)
	{
		if (this->r == complex.r &&
			this->i == complex.i)
		{
			return true;
		}
		else return false;
	}

	friend ostream& operator<<(ostream& os, const Complex& complex)
	{
		os << "(" << complex.r << " + " << complex.i << "i)";

		return os;
	}
};

int main()
{
	Complex c1(2.1, 4.5);
	Complex c2(1.5, 3.8);

	// 대입 연산자 =
	Complex c3 = c1 + c2;

	// << 연산자
	cout << c3 << endl;

	Complex c4(3.6, 8.3);

	// 비교 연산자 ==
	if(c3==c4)
	{
		cout << "c3 과 c4는 같은 값임\n";
	}

	// 전위 ++
	cout << ++c3 << endl;

	// 후위 ++
	cout << c3++ << endl;
	cout << c3;
}

 

간단하게 복소수를 나타내는 Complex를 만들어 테스트해 보았다.

 

복소수의 실수부와 허수부가 각각 r과 i에 저장된다.

 

다른 것은 특별할게 없고 << 연산자의 중복이 좀 특이한데 friend 키워드로 ostream에 접근해주면 된다.

 

실행결과

댓글