연산자 오버로딩 교환법칙
교환 법칙은 - 와 + 연산자에서 허용되는 법칙이다. 객체 끼리의 계산 또한 일반 상수와 연산을 하거나
교환 법칙을 사용해야 할 때가 있다.
(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;
}
교환 법칙은 - 와 + 연산자에서 허용되는 법칙이다. 객체 끼리의 계산 또한 일반 상수와 연산을 하거나
교환 법칙을 사용해야 할 때가 있다.
(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;
}