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)                                        // 불가능