본문 바로가기

Language/C++

이항연산자 오버로딩의 교환법칙

연산자 오버로딩 교환법칙
교환 법칙은 - 와 + 연산자에서 허용되는 법칙이다. 객체 끼리의 계산 또한 일반 상수와 연산을 하거나
교환 법칙을 사용해야 할 때가 있다.
(A라는 클래스가 있고 priate에 x와y라는 변수가 있다고 가정하자.)
A p1(1,2);
A p2 = p1 + 3;
이 문장을 해결 하기 위해서는 연산자 오버로딩을 약간 변경 해야한다.
매개변수를 받아오는 부분에서 자신의 자료형인 A 클래스의 객체를 받는 것이 아니라
int 형 매개변수를 받아와야 한다는 것이다. 구현부는 다음과 같다.
A operator+(int val)
{
    A(p1.x + val, p1.y + val);
    return temp;
}
하지만 만일
A p3 = 3 + p1; 이라는 코드를 추가했다고 가정하면 문제가 생기게 된다. 특히 멤버함수로 연산자 오버로딩을 했다면
이 문장은 3.operator+(p1); 이라는 코드로 묵시적으로 변환이 될 꺼라 예상을 해볼수 있다. 당연히 변환이 되기 전에 에러를
이르키지만 만일 변환이 됐다고 해도 역시 말이 않되는 문장이다. 이를 해결하기 위해서는 일반 전역 함수로 연산자 오버로딩을
해야한다.
클래스 부
friend A operator+(int val, A& p);

A operator+(int val, A& p)
{
    A temp(p.x + val, p.y + val);
    return temp;
}
이렇게 한다면 간단하게 해결이 가능하다.
또한 함수 내용을 간단하게 한줄로도 표현이 가능하다

return p+val;
또한, 임시 객체를 사용해도 무관 하다^^

return A(p.x + val,p.y + val);

이는 리턴하기 전에 연산자 오버로딩이 멤버 함수로 선언된 연산자 오버로딩 함수를 호출함으로써 해결이 된다.
한마디로 + 나 - 의 연산자 오버로딩을 하게 된다면 객체끼리의 연산 상수끼리의 연산을 모두 해줘야 한단는 것이다...(--; )에휴..

참고 소스이다.~
#include <iostream.h>

class Point
{
private:
    int x, y;
public:
    Point(int _x = 0,int _y = 0):x(_x), y(_y)//멤버 이니셜라이져.
    {
    }
    void ShowPosition();
    Point operator+(int val);//매개변수를 정수형으로 받는다.
    friend Point operator+(int val, Point& p);

};

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

Point Point::operator+(int val)
{
    Point temp(x + val, y + val);

    return temp;//참조로 리턴을 하지 않는다
}

Point operator+(int val, Point& p)
{
    Point temp(p.x + val, p.y + val);
    return temp;
    
}

int main()
{
    Point p1(1,2);
    Point p2 = p1 + 3;//묵시적으로 p1.operator+(3); 이 호출된다.
    Point p3 = 3 + p1;
    p2.ShowPosition();
    p3.ShowPosition();

    return 0;
}