연산자를 오버로딩하는 두 가지 방법
2019. 8. 19. 21:48ㆍPL/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;
}
'PL > C++' 카테고리의 다른 글
복사생성자와 치환연산자를 정의할 때 주의할 점 (0) | 2019.08.20 |
---|---|
네임스페이스 (0) | 2019.08.20 |
연산자 오버로딩 =과 == (0) | 2019.08.19 |
[boost.Asio tutorial] Using a member function as a handler (0) | 2019.08.14 |
[boost.Asio tutorial] Binding arguments to a handler (0) | 2019.08.14 |