본문 바로가기
프로그래밍/C++

C++, 연산자 오버로딩 설명과 사용법!!(교환법칙까지~)

by Hwan2 2019. 3. 12.
반응형

 

 

 

 

 

보통 데이터의 값을 더하거나 뺄 때 저희는 이런 식으로 작성할 겁니다.

 

int n1 = 10;

int n2 = 20;

 

int sum = n1 + n2;

 

 

하지만 객체의 덧샘을 하게된다면??

 

class A 가 있다고 가정해 본다면

 

A a1;

A a2;

 

A a3 = a1 + a2;

 

이런 식의 객채 연산은 상식적으로 불가능 하다고 보여집니다.

 

하지만 이를 가능하게 하는것이 바로 연산자 오버라이딩 입니다.

 

즉, '+'를 오버라이딩 하는 것입니다.

 

이때 사용하는 것이 operator라는 함수 키워드 입니다.

 

사용 방법을 보면 이렇습니다.

#include<iostream>

using namespace std;

class A {    
public:
    int n1;

    A(int n1) {
        this->n1 = n1;
    }
};

A operator+(const A& a1, const A& a2) {
    A a(a1.n1 + a2.n1);

    return a;
}

int main(void) {
    A a1(10);
    A a2(20);

    A a3 = a1 + a2;

    cout << a3.n1 << endl;
    
    return 0;
}
 

 

여기서 +만 무조건 되는건 아닙니다. operator-, operator*, operator/ 등.... 이 가능합니다.

 

아래는 operator로 오버라이딩이 가능한 키워드를 소개하겠습니다.

 

= (할당 연산자, assignment operator)

+ - * (이진 산술 연산자, binary arithmetic operators)

+= -= *= (복합 할당 연산자, compound assignment operators)

== != (비교 연산자, comparison operators)

 

위에 것들이 사용 가능한 키워드 이며 사용자가 오버라이딩을 통해 재 정의가 가능합니다.

 

아래는 오버라이딩이 불가능한 연산자를 소개하겠습니다.

 

.                        맴버 접근 연산자

.*                       맴버 포인터 연산자

::                       범위 지정 연산자

?:                       조건 연산자(3항 연산자)

sizeof                 바이트 단위 크기 계산

typeid                 RTTI 관련 연산자

static_cast            형변환 연산자

dynamic_cast        형변환 연산자

const_cast            형변환 연산자

reinterpret_cast      형변환 연산자

 

 

 

연산자 오버라이딩은 저희가 흔히 사용하는 ++ or --도 지원을 하고 있습니다.

#include<iostream>

using namespace std;

class A {    
public:
    int n1;

    A(int n1) {
        this->n1 = n1;
    }
};

A& operator++(A& a1) {            //전위증가
    a1.n1++;

    return a1;
}

A operator++(A& a1, int) {        //후위증가
    A temp(a1.n1);

    a1.n1++;

    return temp;
}

int main(void) {
    
    A a(10);

    ++a;
    cout << a.n1 << endl;

    A p = a++;

    cout << p.n1 << endl;
    cout << a.n1 << endl;
    
    return 0;
}
 

 

 

 

 

위 예제에서 보이듯 전위증가와 후위증가가 잘 된걸 볼 수 있습니다.

 

전위 증가의 선언 방법은

operator++() 이고

 

후위증가 선언 방법은

operator++(int) 입니다.

 

즉, 매개변수에 int의 여부에 따라 전위인지 후위인지 결정되는 것입니다.

 

 

 

그렇다면.....  교환법칙 문제의 해결은 어떻게 하면 좋을까요??

 

즉, 3 + a1 요녀석을 어떻게 해야하는지는 아래의 예시를 통해 설명하겠습니다.

#include<iostream>

using namespace std;

class A {    
public:
    int n1;

    A(int n1) {
        this->n1 = n1;
    }
};

A operator+(const int num, const A& a) {
    A temp(num + a.n1);

    return temp;
}

A operator+(const A& a, const int num) {

    return num + a;
}

int main(void) {
    
    A a(10);
    int num = 20;

    A p1 = num + a;
    A p2 = p1 + num;

    cout << p1.n1 << endl;
    cout << p2.n1 << endl;
    
    return 0;
}
 

 

 

이런식으로 operator를 정의하면 되겠습니다.!!

 

 

 

 

 

 

반응형

댓글


스킨편집 -> html 편집에서