연산자의 동작을 추가 정의하는 기능을 말한다. 사용자 정의 자료형처럼 서로 호환되지 않아 연산이 불가능한 자료형에 대해 연산이 가능하도록 만든다.
사용자 정의 자료형에는 다양한 자료형 혹은 연산을 지원하지 않는 자료형이 섞여있어서 연산을 할 수 없을 경우(산술 연산자, 입출력 연산자, 비교 연산자 등) 해당 연산자를 사용할 때 오버로딩된 연산자를 호출하여 연산을 수행할 수 있다.
+ - * / % 연산자를 오버로드하여 클래스에서 산술 연산을 지원할 수 있다. 보통 멤버 함수로 구현해 사용하지만 때에 따라 전역 함수 형태로 사용한다.
== != < > <= >= 연산자를 오버로드하여 클래스에서 비교 연산을 지원할 수 있다. 보통 멤버 함수로 구현해 사용하지만 때에 따라 전역 함수 형태로 사용한다.
= 연산자를 오버로드하여 사용자 정의 클래스의 객체간의 할당을 지원할 수 있다. 할당 연산자는 멤버 함수 형태로만 오버로딩이 가능하다.
++ -- - ! 등의 연산자를 오버로드하여 클래스에서 단항 연산을 지원할 수 있다. 보통 멤버 함수로 오버로딩하여 사용한다.
<< >> 연산자를 오버로드하여 클래스에서 사용자 정의 자료형 입출력이 필요할 때 사용한다. 이들은 전역 함수로 오버로딩되는 것이 일반적이다.
[] 연산자를 오버로드하여 클래스를 배열처럼 동작하게 만들 수 있다. 배열 인덱스 연산자는 멤버 함수로만 오버로딩될 수 있다.
() 연산자를 오버로드하여 클래스에서 함수 호출과 유사한 동작을 지원할 수 있다. 이 연산자는 멤버 함수로만 오버로딩될 수 있다.
-> 연산자를 오버로드하여 클래스에서 포인터와 유사한 동작을 지원할 수 있다. 이 연산자는 멤버 함수로만 오버로딩될 수 있다.
연산자 오버로딩은 주로 멤버 함수나 전역 함수(friend 선언) 형태로 선언, 정의된다. 보통 멤버 함수 형태로 오버로딩이 불가능할 때 전역 함수로 구현한다.
복소수 연산 예시
class Complex
{
private:
double real, imag;
public:
Complex(double r = 0.0, double i = 0.0)
: real(r), imag(i) {}
Complex operator+(const Complex& rhs) const
{
return Complex(real + rhs.real, imag + rhs.imag);
}
};
int main()
{
Complex a(1.0, 2.0);
Complex b(2.0, 3.0);
Complex result = a + b;
}
. . .