overloading은 기본적으로 signature (인자들의 타입 및 그들의 순서,개수)를 달리해서,
인자에 따라 적절한 함수가 호출 되도록 한다.
호출 우선 순위의 문제가 있는데, 예를 들어 인자가 상위 클래스 타입과 하위클래스 타입 각각에 대해
함수가 오버로딩되어있으면 되도록이면 자기 클래스 타입에 맞는 것이 호출 되게 된다.
하지만 좀더 자세히 우선순위를 따지려면 까다롭다. (예를 들어,디폴트 파라미터 등과 관련해서 생각할 것들이 있다.)
그것은 나중에 정리하도록 하고.
operator overloading은 signature와 return type 및 동작을 이해해야 한다.
이것을 할 때는 operator를 멤버함수로 구현하는 경우가 아닌 한,
인자중 적어도 하나는 클래스 타입이어야한다.
friend선언을 하지 않으면 automatic type conversion의 이득이 없다.
그리고 이렇게 선언할 때는 그냥 멤버 operator로 둘 때와 달리
호출하는 쪽의 객체도 인자로 추가해야한다. (그래서 적어도 인자중 하나가 클래스 타입)
잘 이해해두면 STL을 이용할 때도 도움이 된다.
주의: friend 선언했다고 가정
주의: left가 안바뀌면 const로 선언해야 한다. (const 멤버함수를 일단 쓰기 시작하면 const 객체가 호출할 수 있는 모든 멤버를 const 멤버로 바꿔야한다 !
1. < (strict weak ordering)
bool operator < (const T& a,const T& b) ) const;
//참값을 반환하면 a가 b보다 작다는 의미. const 멤버함수로 선언할 것!
(예) 정의
bool operator< (const list& a,const list & b) const { if(a.size()==0 && b.size()!=0)return true; else if(b.size()==0)return false; assert(a.size()!=0 && b.size()!=0); a_get=long double(a.front())/(a.size()-1); //front() b_get=long double(b.front())/(b.size()-1); return (a_get < b_get || ( (a_get == b_get) && a.front() >b.front() ) ) ; }
2. == (equality)
보통 두 변수의 주소가 같은지 비교하는 것보다 내부 원소 및 멤버가 같은지 비교하기 위해 오버로딩 된다.
bool operator == ( const T& a,const T&b); const // true 면 a와 b가 const 멤버함수로 선언할 것!같다는 의미
3. = (Assignment )
이것은 friend 로 정의할 수 없다. 오버로딩하지 않으면 = operator 가 멤버 대 멤버 대입으로 생성된다.
= 을 오버로딩 할 필요가 있을 때는 소멸자, 복사생성자도 같이 정의해야한다. (동적 메모리 할당 관련)
T& T::operator = ( const T& rightSide) { if(this == &rightSide) return *(this); else // 깊은 복사를 하라. { ... return *(this); } }
4. [ ] (Index)
[ ]를 오버로딩하는 경우,[ ]안에 정수형이 아닌 다른 자료형이 들어갈 수 있다.
반환형은 다양하게 만들 수 있다.
멤버함수로 만들 때 [ ]안에 하나의 인자(멤버가 아니면 두 개의 인자)만 들어가야 되는지는 아직 조사중. 하지만 안될 것으로 보인다.
멤버함수로 만드는 경우
예를 들어
int* T::operator [ ] (string a ) ; 라면
이것을 호출하고 싶을 때
T t;
t["abcd"] <- 이런식으로 사용한다.
-- &&, || 오버로딩에 대해
ISO/IEC 14882:1998(E) 1.9.18
In the evaluation of the following expressions
a && b a || b a ? b : c a , b
using the built-in meaning of the operators in these expressions, there is a sequence point after the evaluation of the first expression (12).
C++-specific caveat: short-circuiting will NOT apply to overloaded ||
and &&
.
Footnote 12: The operators indicated in this paragraph are the built-in operators, as described in clause 5. When one of these operators is overloaded (clause 13) in a valid context, thus designating a user-defined operator function, the expression designates a function invocation, and the operands form an argument list, without an implied sequence point between them.
'Application-level프로그래밍' 카테고리의 다른 글
(C++) Virtual function 요약 (0) | 2009.09.13 |
---|---|
(C++) Inheritance(상속) 요약 (0) | 2009.09.13 |
(C++) 클래스의 멤버변수를 레퍼런스 타입으로 갖으려면 (0) | 2009.09.13 |
(C)circular dependency,error: forward declaration (0) | 2009.09.08 |
(C++)디버깅을 위해 파일에 정보를 기록해주는 소스 (0) | 2009.07.27 |