연산자를 오버로딩하는 두 가지 방법

2019. 8. 19. 21:48PL/C++

1. 멤버함수에 의한 연산자 오버로딩

2. 전역함수에 의한 연산자 오버로딩

 

총 2가지 방법으로 연산자 오버로딩을 할 수 있는데, 2가지가 있는 이유는 경우에 따라서 한 가지 방법이 제한될 수 있기 때문이다

 

예를 들어 cout과 어떠한 클래스 객체에 대해서 >> 연산자 오버로딩을 하려고 한다. 순서는 문법에 따라서 cout << 클래스 객체로 이뤄질텐데, 그러면 cout의 자료형인 ostream 클래스 내부에서 오버로딩되어야 하지만 불가능하다. 따라서 전역함수에 의한 연산자 오버로딩을 통해서만 정의를 내릴 수 있다

 

다음은 cout와 클래스 Complex에 대해서 << 연산자를 재정의 한 코드다 

 

#ifndef COMPLEX_H
#define COMPLEX_H

#include <iostream>

template <typename T>
class Complex {
private:
	 T re, im;

public:
	Complex(T re, T im) {
		this->re = re;
		this->im = im;
	}
	T get_re(void) const {
		return re;
	}
	T get_im(void) const {
		return im;
	}
	friend std::ostream& operator<<(const std::ostream &out, const Complex &ref);
};

template <typename T>
std::ostream& operator<<(std::ostream &out, const Complex<T> &ref)
{
	out << ref.get_re() << ' ' << ref.get_im() << '\n';
	return out;
}

#endif
#include <iostream>
#include "complex.h"

int main(void) {
	Complex<double> A(3, 4);
	std::cout << A.get_re() << ' ' << A.get_im() << '\n';
	std::cout << A;
	return 0;
}