[C++] 연산자 오버로딩에 대하여

연산자 오버로딩이란?

연산자 오버로딩이란 연산자를 재정의하여 사용자가 원하는 형태로 사용이 가능하게끔 하는것을 말합니다. 대부분의 기본 제공 연산자 함수는 전역 함수 또는 클래스로 재정의 가능합니다. 오버로드 된 연산자는 함수로 구현됩니다. 이렇게 재정의된 연산자 함수는 연산자를 이용하듯 호출할 수 있습니다. 이렇게 연산자들을 함수로 만들어서 넣어주면 사용자는 훨씬 더 간결한 방법으로 코드를 작성할수도 있고 코드의 확장성도 높아집니다.

 

연산자 오버로딩 사용시 주의점

1. C++에서 사용되지 않는 연산자는 재정의 할 수 없습니다.

2 기본 제공 데이터 형식에 적용할때 연산자의 의미를 다시 정의할 수 없습니다.

3. 오버로딩 한 연산자는 클래스 멤버함수이거나 전역함수여야만 합니다.

 

연산자 오버로딩 할 수 없는 연산자들

연산자 사용처
. 멤버 선택
.* 멤버의 포인터 선택
:: 범위지정 연산자
?: 조건 연산자
# 문자열 전처리기 변환
## 문자열 전처리기 연결

 

연산자 오버로딩 사용법

#include <iostream>
using namespace std;
class myOperation {

public:
    void operator+ (int num) {
        cout << "+를 한다." << endl;
    }
    void operator- (int num) {
        cout << "-를 한다." << endl;
    }
    void operator* (myOperation oper) {
        cout << "*를 한다." << endl;
    }
    void operator/ (myOperation oper) {
        cout << "/를 한다." << endl;
    }
};

int main() {

    myOperation a, b;

    a + 1;
    a - 2;
    a * b;
    a / b;
}

연산자 오버로딩 예제1

간단하게 연산자 오버로딩을 사용하여 객체의 사칙연산시 로그를 남기는 예제를 만들어보았습니다. 위의 예제처럼  operator 연산자 이런식으로 함수명을 지정하게 되면 연산자를 오버로딩할 수 있습니다.

 

전역함수 연산자 오버로딩

#include <iostream>
using namespace std;
class myOperation {};

void operator+ (myOperation oper) {
    cout << "+를 한다." << endl;
}

void operator- (myOperation operr) {
    cout << "-를 한다." << endl;
}

void operator* (int num, myOperation oper) {
    cout << "*를 한다." << endl;
}

void operator/ (int num, myOperation oper) {
    cout << "/를 한다." << endl;
}

int main() {

    myOperation a;

    +a ;
    -a;
    1 * a;
    1 / a;
}

연산자 오버로딩 예제2

클래스의 멤버 함수로 연산자 오버로딩하면 인자값을 하나밖에 받을 수 없어 (객체 연산자)이런식으로 항상 연산자가 객체 뒤에 와야만 연산이 가능하지만 전역함수로 연산자 오버로딩을 하면 첫번째 파라미터로 일반 변수 타입을 받을수도 있고 사용시 (연산자 객체) 이렇게도 사용이 가능합니다.

댓글

Designed by JB FACTORY