본문 바로가기

Language/C++

연산자 오버로딩(전역함수)

연산자 오버로딩을 할때는 멤버함수로 연산자 오버로딩을 하지만 일반 전역 함수로도 연산자 오버로딩이 가능하다.
일반 전역 함수로 연산자 오버로딩을 할때는 반드시 필요한 키워드가 한개가 더 있다.
그것은 바로 friend^^ 이다~

이유는 간단하다. private 영역을 외부에서는 접근허용을 하지 않게 되어있다.
하지만 객체끼리 연산은 반드시 모든 멤버를 연산하여야 된다는 조건이 붙게 되는데 그것을 가능케 해주는 것이
friend 키워드 이다.

사용법^^
1.일반 전역 함수로 연산자 오버로딩을 하기 위해서 우선적으로 연산자 오버로딩을 하고자 하는 클래스에 friend 함수를
선언 해줘야 한다.
(A라는 클래가 있고 private 에 int x,y 가 있다고 가정하자)

friend A operator+(const A&,const A&);

2.그리고 일반 전역 함수를 만든다...

A operator+(const A& p1,const A& p2)
{
    A temp(p1.x = p2.x , p1.y = p2.y);
    return temp;
}
3.메인함수에서 더해주면 끗....
int main...
    A p3 = p1 + p2;

해석을 해보자면 1번에서 보면 friend 함수를 선언 해줬다. 친구 먹어준거임...ㄳ(개새 아님)
두개의 매개변수를 받는걸 볼수 있는데 이 이유는 멤버 함수에서와 달리 모든 피연산자를 알아야지 + 를 하던 - 하던 하기
때문이다. 이는 이항연산에서는 이짓을 해줘야한다. (상식적으로 생각해도 두개의 피연산자는 필이지;;)멤버 함수 에서
연산자 오버로딩을 하게 되면 어짜피 호출되는 부분이 p1 의 멤버이기 때문에 피연산자 하나는 잡고 가기 때문이다.
하지만 일반 전역 함수로 연산자 오버로딩을 하게 되면 어디와 어디를 더하는지를 모두 알아야 한다. 그 이유이다.
그리고...나머지는 동일하다. 단지 문법적으로 좀 틀리게 보이는 부분은 전역함수라면, 함수 구현부분 에서
A A::operator+(const A& p) 이지만 일반 전역 함수는 A:: 가 않붙는다는거 <--이건 문법적인거임;;
역시 복사 생성자가 호출되는건 당연한 일이다^^.

#include <iostream.h>

class Point
{
private:
    int x, y;
public:
    Point(int _x = 0,int _y = 0):x(_x), y(_y)//멤버 이니셜라이져.
    {
    }
    void ShowPosition();
    friend Point operator+(const Point&,const Point&);//frined 키워드로 인하여 일반 전역 함수가 private의 영역을 참조할 수 있다.
};

void Point::ShowPosition()
{
    cout<<x<<""<<y<<endl;
}

Point operator+(const Point& p1, const Point& p2)//첫 번째 매개변수가 + 연산의 좌측 피연산자이며 우측도 마찬가지다.
{
    Point temp(p1.x+p2.x, p1.y+p2.y);
    return temp;
}

int main()
{
    Point p1(1,2);
    Point p2(2,1);
    Point p3 = p1 + p2;//operator+ 는 전역함수 이기 때문에 묵시적으로 operator+(그냥 + 도 무관)(p1,p2) 형식으로 피연산자를 모두 넘겨줘야한다.

    p3.ShowPosition();

    return 0;
}

전역 함수로 선언시에는 반드시 friend 함수를 사용하여 private영역을 참조할수 있도록 해줘야 한다.
또한, 멤버 변수가 아닌기 때문에 연산자 오버로딩이 된 함수의 매개변수는 모든 피연산자를 받아
줘야한다^^.