반응형

연산자 재정의(Operator Overloading) 개념

 

  • a + b 코드에서

    • a, b가 모두 primitive type(int, double등)일 경우 : 덧셈 수행

    • a, b중 하나라도 user defined type일 경우 : operator+() 함수를 찾게 됨

  • c1 + c2 코드를 컴파일러가 해석하는 방법

    • 우선 c1.operator+(c2) 멤버 함수를 찾게 됨

    • 없으면 operator+(c1, c2) 일반 함수를 찾게 됨

  • 멤버 함수 구현

    • +는 이항 연산자 이지만 객체 자신이 있으므로 operator+() 함수의 인자는 1개

  • 일반 함수 구현
    • operator+()의 함수 인자는 2개
    • 일반적으로 인자로 받은 객체 private 멤버 접근을 위해 friend 함수로 등록
class Complex
{
    int re, im;

public:
    Complex(int r = 0, int i = 0) : re(r), im(i) {}

    void print() const
    {
        std::cout << re << ", " << im << std::endl;
    }
   
    // + 연산자 재정의
    Complex operator+(const Complex& c)
    {
        Complex temp(re + c.re, im + c.im);
        return temp;
    }
    
    friend Complex operator+(const Complex& c1, const Complex& c2); // friend 접근자 등록
};

Complex operator+(const Complex& c1, const Complex& c2)
{
    // 일반함수에서 객체의 private 멤버에 접근이 필요하므로 friend 접근자 등록
    Complex temp(c1.re + c2.re, c1.im + c2.im);
    return temp;
}

int main()
{
    int n = 3 + 4; // OK

    Complex c1(1, 1);
    Complex c2(2, 2);
    Complex c3 = c1 + c2; // 1. c1.operator+(c2), 2. operator+(c1, c2)
    c3.print();
}

연산자 재정의 정리

  • 인자가 모두 primitive type인 경우는 재정의 불가
  • 재정의 불가 연산자
    • ".*", "::", "sizeof", "typeid", "static_cast", "dynamic_cast", "reinterpret_cast", "const_cast", "."
  • 멤버 함수와 일반 함수로 2가지 모두 제공 가능
  • 2가지 모두 제공시 멤버 함수 우선 호출
  • 1번째 인자가 user defined type이 아닌 경우는 일반 함수로만 만들 수 있음(객체가 아니므로 멤버 함수 제공 불가)
  • 멤버 함수로만 재정의 가능한 연산자
    • "=", "()", "[]", "->"
  • 새로운 연산자를 만들거나, 인자의 개수를 변경하거나, 연산자 우선순위를 변경 할 수 없음
  • 기본 파라미터 사용 불가

중요 연산자들

  • << : cout 의 원리

  • ++ : STL 반복자를 만드는 원리, 구현 과정 중요
  • -> : 스마트 포인터
  • () : 함수 객체
  • [] : 객체를 배열처럼 
  • = : 복사 생성자와 유사한 개념(Shallow copy / Deep copy)
반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

C++ 함수 객체(Function Object)  (0) 2019.05.10
C++ 연산자 재정의 - cout, endl 원리  (2) 2019.05.08
C++ static, const, this  (0) 2019.05.07
C++ 복사 생성자  (0) 2019.05.06
C++ 접근 지정자, 생성자, 소멸자  (0) 2019.05.06

+ Recent posts