'연산자 함수'는 연산자를 이용하듯 호출할 수 있는 메서드입니다. 

아래 코드를 살펴보겠습니다.

void main() {
    int a = 10, b = 20;
    a + b; // '10 + 20'으로 30이 됩니다.
    MyData c, d;
    c + d; // '사용자 정의 타입'끼리의 덧셈?
}

 

수학적으로 봤을 때 '+' 연산자는 각각 좌, 우측의 값이 'int'형 정수인, 정수 값끼리의 덧셈입니다.

하지만, 가만히 생각해보면 '+' 연산은 굳이 숫자에만 적용할 수 있는 것이 아닙니다. 예를 들어, String 타입간의 '+' 연산은 알다시피 두 문자열이 합쳐집니다.

void main() {
    string a{ "Hello, " }, b{ "world" };
    string c = a + b; // 'c'는 당연히 "Hello, World" 문자열이 들어갑니다.
}

 

string 타입C++ STL에서 제공해주는 '문자열 컨테이너'입니다. 즉, 클래스인거죠. string 타입간의 '+' 연산이 가능한것도 'string 클래스'에서 '+' 연산자를 재정의했기 때문에 가능한 일입니다.

예제를 살펴보겠습니다.

class MyData {
private:
    int m_nData = 0;
    
public:
    // 변환 생성자
    MyData(int nParam) : m_nData{ nParam } { /* do somthing */ }
    
    // 복사 생성자
    MyData(const MyData& rhs) : m_nData{ rhs.m_nData } { /* do somthing */ }
    
    // 이동 생성자
    MyData(const MyData&& rhs) : m_nData{ rhs.m_nData } { /* do somthing */ }
    
    // MyData -> int 형변환 연산자 정의
    operator int() { return m_nData }
    
    // '+' 연산자 재정의
    MyData operator+(const MyData& rhs)
    {
        return MyData{ this->m_nData + rhs.m_nData };
    }
    
    // '=' 연산자 재정의
    MyData& operator=(const MyData& rhs)
    {
        this->m_nData = rhs.m_nData;
        
        return *this;
    }
}

void main()
{
    MyData a{ 10 }, b{ 20 }, c{ 0 };
    c = a + b; // c.operator=(a.operator+(b));
}

 

클래스에 '+' 연산자와 '=' 연산자를 재정의하여 제작자가 원하는 동작을 설정할 수 있습니다.

'Programming > C C++' 카테고리의 다른 글

[C++ 문법] '소멸자 가상화'  (0) 2019.05.24
[C++ 문법] '가상 함수(virtual function)'  (0) 2019.05.23
[C++ 문법] '이동 생성자'  (0) 2019.05.22
[C++ 문법] '변환 생성자'  (0) 2019.05.21
[C++ 문법] '복사 생성자'  (0) 2019.05.20