에디의 우당탕탕 코딩공장

[STL] 연산자 오버로딩

by 인턴 에디

💡 연산자 오버로딩에는 두가지 방법이 있다.

    - 멤버 함수를 이용한 연산자 오버로딩

    - 전역 함수를 이용한 연산자 오버로딩

 

✅ 멤버 함수를 이용한 연산자 오버로딩을 사용할 수 없는 경우

   이항 연산의 왼쪽 항이 연산자 오버로딩 객체가 아니면 멤버 함수를 이용한 연산자 오버로딩을 이용할 수 없다. 이항 연산의 왼쪽 객체를 기준으로 연산자 오버로딩 멤버 함수를 호출하기 때문이다.

 

class Point
{
  ...
};

int main()
{
   Point pt1(1,2);
   
   k + pt1; //여기서 k는 연산자 오버로딩 객체가 아니므로 k.operator+(pt1)처럼
   // 호출할 수 없고 operator(k,pt1)처럼 호출해야 한다.
    
   return 0;
}

 

👀 연산자 오버로딩은 컴파일러가 p1 == p2; 와 같은 코드를 두 가지로 해석한다.

   (1) 멤버 함수로 p1.operator == (p2); 처럼 해석

       -> p1의 operator ==() 멤버 함수를 호출해 p2를 인자로 전달

    (2) 전역 함수로 operator ==(p1,p2); 처럼 해석

       -> 전역함수 operator==()의 인자로 p1와 p2 객체를 각각 전달.

 

멤버 함수를 이용한 연산자 오버로딩
#include <iostream>
using namespace std;

class Point
{
   int x;
   int y;
public:
   Point(int _x=0, int _y=0) : x(_x),y(_y){}
   void Print()const { count<< x << ',' << y << endl; }
   int GetX() const { return x; } // x의 getter
   int GetY() const { return y; } // y의 getter
   
   const Point operator-(const Point& arg) const
   {
      return Point(x - arg.x, y - arg.y);
   }
 };
 
 int main()
 {
    Point p1(2,3), p2(5,5);
    Point p3;
    
    p3 = p1 - p2;
    
    p3.Print();
    
    return 0;
  }

📌 p1 - p2 는 p1의 멤버 함수 p1.operator-(p2)를 호출하고 p2는 인자로 전달 된다.

 

전역 함수를 이용한 연산자 오버로딩
#include <iostream>
using namespace std;

class Point
{
   int x;
   int y;
public:
   Point(int _x=0, int _y=0) : x(_x),y(_y){}
   void Print()const { count<< x << ',' << y << endl; }
   int GetX() const { return x; } // x의 getter
   int GetY() const { return y; } // y의 getter
 };
 
const Point operator-(const Point& argL,const Point& argR) const
{
   return Point(argL.GetX - argR.GetX,argL.GetY - argR.GetY);
}
 
 int main()
 {
    Point p1(2,3), p2(5,5);
    Point p3;
    
    p3 = p1 - p2;
    
    p3.Print();
    
    return 0;
  }

📌 p1 - p2 는 전역 함수 operator-(p1,p2)를 호출하고 p1,p2는 인자로 전달 된다.

 

 

✅하지만, 전역 함수를 이용하면  Point 클래스의 private 멤버인 x,y에 접근할 수 없으므로 getter를 이용하거나 프렌드 함수를 사용한다.

friend const Point operator-(const Point& argL, const Point& argR);
const Point operator-(const Point& argL, const Point& argR)
{ 
   return Point(argL.x - argR.x, argL.y - argR.y);

블로그의 정보

에디의 우당탕탕 코딩 공장

인턴 에디

활동하기