자료 저장소

# 연산자 오버로딩

연산자를 오버로딩하게 되면 기존에 존재하던 연산자의 기본 기능 이외에 다른 기능을 추가 할 수 있다.

■ 연산자를 오버로딩 하는 두가지 방법

/* 클래스 내에 멤버함수로 존재하는 경우 */
Point operator+(const Point &ref)
{
Point pos(xpos+ref.xpos, ypos+ref.ypos);
return pos;
}

/* 클래스 외부에 전역함수로 존재하는 경우 */
friend Point operator+(const Point& pos1,const Point& pos2);

/* 전역으로 선언(friend선언으로 멤버접근) */
Point operator+(const Point& pos1,const Point& pos2)
{
Point pos(pos1.xpos+pos2.xpos,pos1.ypos+pos2.ypos);
return pos;
}

int main(void)
{
    ....
    pos1+pos2; // '+'연산자에 의해 operator+ 함수를 찾는다.
    ....
}

(1) 멤버함수로 오버로딩 된 경우

pos1.operator+(pos2);


(2) 전역함수로 오버로딩 된 경우

operator+(pos1,pos2);

■ 오버로딩이 불가능한 연산자의 종류















■ 멤버함수의 형태로만 오버로딩이 가능한 연산자의 종류








■ 연산자를 오버로딩 하는데 있어서의 주의사항

(1) 본래의 의도를 벗어난 형태의 연산자 오버로딩은 프로그램을 혼란스럽게 만들 수 있다.
(2) 연산자의 우선순위와 결합성은 바뀌지 않기때문에 이를 고려해야 한다.
(3) 매개변수의 자료형에 따라서 호출되는 함수가 결정되므로 디폴트 값 설정이 불가능하다
(4) 연산자의 순수기능까지 빼앗을 수는 없다. 이미 정의된 연산자의 기능은 오버로딩이 불가능하다.


# 단항 연산자 오버로딩

■ 증가, 감소 연산자 오버로딩

증가, 감소 단항연산자 또한 전역과 멤버의 두가지 경우로 나뉜다.










단, 단항연산자의 경우 전위와 후위를 구분해야 하는데 구분 및 구현방법은 다음과 같다.




















■ 자료형이 다른 두 피연산자를 대상으로 하는 연산
Point operator*(int n) 
{
Point pos(xpos*n,ypos*n);
return pos;
}
연산자 '*'를 객체의 멤버로 오버로딩했을때 "pos * 3"  이와 같은 문장은 성립한다.

하지만 "3 * pos" 와 같은 문장은 3.operator*(pos)로는 해석이 불가능하다.

따라서, 위와 같은 두가지 경우(교환법칙)에서도 모두 성립하도록 코드를 작성해야 한다.
Point operator*(int n,Point& pos) 
{
return pos*n; // 먼저 pos * n을 만족하는 코드가 작성되어야 한다.
}

# cout, cin, endl의 정체
#include <iostream>     

namespace mystd
{
usingnamespacestd;

class ostream
{
public:
ostream& operator<< (int num)
{
printf("%d", num);
return *this;
}
ostream& operator<< (char * str)
{
printf("%s", str);
return *this;
}
ostream& operator<< (ostream& (*fp)(ostream &ostm))
{
return fp(*this);
}
};

class istream
{
istream& operator>> (int * num)
{
scanf("%d",&num);
return *this;
}
istream& operator>> (char * str)
{
scanf("%s",str);
return *this;
}
};

ostream& endl(ostream &ostm)
{
printf("\n");
fflush(stdout);
return ostm;
}
ostream cout;
}

int main(void)
{
using mystd::cout;
using mystd::endl;
using mystd::cin;

int num;

cin>>num;
cout<<num<<endl;

return0;
}
cout,cin,endl의 대략적인 모습을 name공간에 class와 함수로 정의한 모습이다.
cout,cin,endl 또한 std라는 이름공간안에 선언된 멤버함수들의 연산자 오버로딩을 통해 출력을 하고 입력을
받는것이다.

ostream,istream은 이름공간 std 안에 선언되어있으며 헤더파일<iostream>을 추가해야 한다.

■ <<, >> 연산자 오버로딩

<, >> 연산자 오버로딩을 통해 객체를 cout의 함수 호출을 통해 바로 출력하도록 하는 예제이다.



















댓글 로드 중…

최근에 게시된 글