# 연산자 오버로딩
연산자를 오버로딩하게 되면 기존에 존재하던 연산자의 기본 기능 이외에 다른 기능을 추가 할 수 있다.
■ 연산자를 오버로딩 하는 두가지 방법
/* 클래스 내에 멤버함수로 존재하는 경우 */
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)연산자 '*'를 객체의 멤버로 오버로딩했을때 "pos * 3" 이와 같은 문장은 성립한다.
{
Point pos(xpos*n,ypos*n);
return pos;
}
하지만 "3 * pos" 와 같은 문장은 3.operator*(pos)로는 해석이 불가능하다.
따라서, 위와 같은 두가지 경우(교환법칙)에서도 모두 성립하도록 코드를 작성해야 한다.
Point operator*(int n,Point& pos)
{
return pos*n; // 먼저 pos * n을 만족하는 코드가 작성되어야 한다.
}
# cout, cin, endl의 정체
#include <iostream>cout,cin,endl의 대략적인 모습을 name공간에 class와 함수로 정의한 모습이다.
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 또한 std라는 이름공간안에 선언된 멤버함수들의 연산자 오버로딩을 통해 출력을 하고 입력을
받는것이다.
ostream,istream은 이름공간 std 안에 선언되어있으며 헤더파일<iostream>을 추가해야 한다.
■ <<, >> 연산자 오버로딩
<, >> 연산자 오버로딩을 통해 객체를 cout의 함수 호출을 통해 바로 출력하도록 하는 예제이다.
'프로그래밍 > C/C++' 카테고리의 다른 글
C++ :: 스마트 포인터(Smart Pointer), 펑터(Functor) (0) | 2010.08.24 |
---|---|
C++ :: 연산자 오버로딩(2) 디폴트대입연산자,배열인덱스연산자 (0) | 2010.08.24 |
C++ :: 함수 오버라이딩, 가상함수, 다형성 (0) | 2010.08.17 |
C++ :: 상속, 상속의 문법과 조건, IS-A & HAS-A 관계 (0) | 2010.08.16 |
C++ :: const 선언, C++에서의 static, mutable 키워드 (0) | 2010.08.14 |
댓글 로드 중…