Native/C++
전역 연산자 함수
aucd29
2013. 10. 2. 18:58
전역 연산자 함수
[code]
// Example
#include <Turboc.h>
class Time
{
// 전역으로 사용하기 위해서 friend를 붙였다.
friend const Time operator+(const Time &T1,const Time &T2);
private:
int hour,min,sec;
public:
Time() { }
Time(int h, int m, int s) { hour=h; min=m; sec=s; }
void OutTime() {
printf("%d:%d:%d\n",hour,min,sec);
}
};
const Time operator+(const Time &T1,const Time &T2)
{
Time R;
R.sec=T1.sec + T2.sec;
R.min=T1.min + T2.min;
R.hour=T1.hour + T2.hour;
R.min += R.sec/60;
R.sec %= 60;
R.hour += R.min/60;
R.min %= 60;
return R;
}
void main()
{
Time A(1,1,1);
Time B(2,2,2);
Time C;
A.OutTime();
B.OutTime();
C=A+B;
C.OutTime();
}
// friend 선언 이유
Time의 주요 멤버인 hour, min, sec은 모두 프라이비트 액세스 속성을 가지고 있으므로 클래스 외부의 전역 함수에서 이 멤버를 참조할 수 없다. 전역 operator + 함수는 시각 객체끼리 덧셈을 하기 위해 이 멤버들을 자유롭게 읽을 수 있어야 하는데 이럴 때 사용하는 것이 바로 프렌드 선언이다.
// Example
#include <Turboc.h>
enum origin { EAST, WEST, SOUTH, NORTH };
origin &operator++(origin &o)
{
if (o == NORTH) {
o = EAST;
} else {
o=origin(o+1);
}
return o;
}
void main()
{
origin mark=WEST;
int i;
for (i=0;i<7;i++) {
printf("%d\n",++mark);
}
}
// 해당 소스의 결과
NORTH인 상태에서 다시 Increment 하게 되면 EAST로 넘어가게된다.
// Example
#include <Turboc.h>
class Time
{
private:
int hour,min,sec;
public:
Time() { }
Time(int h, int m, int s) { hour=h; min=m; sec=s; }
void OutTime() {
printf("%d:%d:%d\n",hour,min,sec);
}
// 시간 클래스에 정수를 더하면 그 정수가 시간형태로 입력되는 방법이다.
// 가령 정수를 120 을 입력하게 되면 120초로 인식 2분이 올라가게 되는
// 결과를 보이게 된다. 하지만 이는 A+5 와 같은 연산만 가능하기에 하단에
// 함수를 추가하게 된다..
const Time operator +(int s) const {
Time R=*this;
R.sec += s;
R.min += R.sec/60;
R.sec %= 60;
R.hour += R.min/60;
R.min %= 60;
return R;
}
// 이 함수는 5+A를 구현하기 위한 단순한 함수 이기때문에 상단에 함수를
// 그대로 이용하면 되기에 인수에 위치만 변경해서 출력 해주게 되면 된다.
const Time operator +(int s)
{
return s+*this;
}
};
void main()
{
Time A(1,2,3);
A.OutTime();
A=A+5;
A.OutTime();
}
[/code]
// Example
const Time Time::operator +(Time &T) // 가능
const Time Time::operator +(int i) // 가능
const Time operator +(Time &T,int i) // 가능
const Time Time::operator +(Time &T1,Time &T2) // 불가능
const Time operator +(Time &T) // 불가능
const Time operator +(void) // 불가능
[code]
// Example
#include <Turboc.h>
class Time
{
// 전역으로 사용하기 위해서 friend를 붙였다.
friend const Time operator+(const Time &T1,const Time &T2);
private:
int hour,min,sec;
public:
Time() { }
Time(int h, int m, int s) { hour=h; min=m; sec=s; }
void OutTime() {
printf("%d:%d:%d\n",hour,min,sec);
}
};
const Time operator+(const Time &T1,const Time &T2)
{
Time R;
R.sec=T1.sec + T2.sec;
R.min=T1.min + T2.min;
R.hour=T1.hour + T2.hour;
R.min += R.sec/60;
R.sec %= 60;
R.hour += R.min/60;
R.min %= 60;
return R;
}
void main()
{
Time A(1,1,1);
Time B(2,2,2);
Time C;
A.OutTime();
B.OutTime();
C=A+B;
C.OutTime();
}
// friend 선언 이유
Time의 주요 멤버인 hour, min, sec은 모두 프라이비트 액세스 속성을 가지고 있으므로 클래스 외부의 전역 함수에서 이 멤버를 참조할 수 없다. 전역 operator + 함수는 시각 객체끼리 덧셈을 하기 위해 이 멤버들을 자유롭게 읽을 수 있어야 하는데 이럴 때 사용하는 것이 바로 프렌드 선언이다.
// Example
#include <Turboc.h>
enum origin { EAST, WEST, SOUTH, NORTH };
origin &operator++(origin &o)
{
if (o == NORTH) {
o = EAST;
} else {
o=origin(o+1);
}
return o;
}
void main()
{
origin mark=WEST;
int i;
for (i=0;i<7;i++) {
printf("%d\n",++mark);
}
}
// 해당 소스의 결과
NORTH인 상태에서 다시 Increment 하게 되면 EAST로 넘어가게된다.
// Example
#include <Turboc.h>
class Time
{
private:
int hour,min,sec;
public:
Time() { }
Time(int h, int m, int s) { hour=h; min=m; sec=s; }
void OutTime() {
printf("%d:%d:%d\n",hour,min,sec);
}
// 시간 클래스에 정수를 더하면 그 정수가 시간형태로 입력되는 방법이다.
// 가령 정수를 120 을 입력하게 되면 120초로 인식 2분이 올라가게 되는
// 결과를 보이게 된다. 하지만 이는 A+5 와 같은 연산만 가능하기에 하단에
// 함수를 추가하게 된다..
const Time operator +(int s) const {
Time R=*this;
R.sec += s;
R.min += R.sec/60;
R.sec %= 60;
R.hour += R.min/60;
R.min %= 60;
return R;
}
// 이 함수는 5+A를 구현하기 위한 단순한 함수 이기때문에 상단에 함수를
// 그대로 이용하면 되기에 인수에 위치만 변경해서 출력 해주게 되면 된다.
const Time operator +(int s)
{
return s+*this;
}
};
void main()
{
Time A(1,2,3);
A.OutTime();
A=A+5;
A.OutTime();
}
[/code]
// Example
const Time Time::operator +(Time &T) // 가능
const Time Time::operator +(int i) // 가능
const Time operator +(Time &T,int i) // 가능
const Time Time::operator +(Time &T1,Time &T2) // 불가능
const Time operator +(Time &T) // 불가능
const Time operator +(void) // 불가능