7.1.1 전역 연산자 중복 정의
전역에서 연산자 중복 정의를 할 때에는 다음과 같은 포맷을 갖게 됩니다.
[리턴 형식] operator [연산기호] (피 연산자 리스트)
{
[기능 구현]
}
전역 연산자 중복 정의를 하는 간단한 예를 들어 보기로 할게요.
학생 클래스에 기본 키 역할을 하는 번호 필드를 반환하는 메서드를 이용을 하는 것을 == 연산자를 사용할 수 있도록 만들어 보겠습니다.
Stu.h |
#pragma once #include <iostream> #include <string> using namespace std;
class Stu { const int num; string name; public: Stu(int _num,string _name); int GetNum()const; };
bool operator == (int num, const Stu &stu); |
학생 클래스에는 이미 기본 키 역할을 하는 번호를 반환하는 메서드가 이미 구현되어 있으며 전역에 구현할 == 연산자 중복 정의에 필요한 시그니쳐를 선언을 추가하였습니다.
bool operator == (int num, const Stu &stu);
Stu.cpp |
#include "Stu.h" Stu::Stu(int _num,string _name):num(_num) { name = _name; } int Stu::GetNum()const { return num; } bool operator == (int num, const Stu &stu) { return stu.GetNum() == num; } |
소스 파일에서는 == 연산자 중복 정의 구현에서는 이미 구현이 되어 있는 Stu 클래스의 GetNum 메서드를 호출하여 비교한 결과를 반환하는 코드만 추가하면 되겠네요.
이처럼 구현하면 사용하는 곳에서 int 형식과 Stu 형식을 피 연산자로 하는 == 연산자를 사용하면 중복 정의한 operator== 메서드가 호출이 됩니다. 주의하실 사항은 Stu * 형식은 사용자 정의 형식이 아니며 Stu 형식이 사용자 정의 형식이라는 것입니다. [그림 7.1]을 보시면 이 같은 경우에 컴파일 오류가 발생함을 알 수 있습니다.
[그림 7.1]
Example.cpp |
#include "Stu.h" void Test(Stu *stu,int num); void main() { Stu *s = new Stu(3,"홍길동"); Test(s,4); Test(s,3); } void Test(Stu *stu,int num) { if( num == (*stu) ) { cout<<"일치함"<<endl; } else { cout<<"일치하지않음"<<endl; } } |
이처럼 연산자 중복 정의를 하면 사용자로서는 좀 더 직관적으로 사용할 수 있게 됩니다. 하지만 컴파일러에서는 연산자 중복 정의를 구현한 코드의 논리가 해당 연산에 적절한지에 대한 논리적 부분은 검증하지 않기 때문에 이에 관한 책임은 개발자의 몫입니다. 그리고 사용자는 앞의 예와 같이 사용할 수 있다면 Stu 형식과 정수형 사이에도 == 연산자가 가능할 것이로 생각할 수 있지만 [그림 7.2]을 보면 가능하지 않음을 알 수 있습니다. 연산자 중복 정의를 할 때에는 사용할 개발자의 입장을 고려하여 신뢰성이 떨어지지 않게 구현하여야 합니다.
[그림 7.2]
(모든 동영상 강의는 무료입니다.)
'언어 자료구조 알고리즘 > Escort C++' 카테고리의 다른 글
[C++] 증감 연산자 중복 정의 (0) | 2016.04.15 |
---|---|
[C++] 묵시적 형 변환 연산자 중복 정의 (0) | 2016.04.15 |
[C++] 인덱스 연산자 중복 정의 (배열 클래스 정의) (0) | 2016.04.15 |
[C++] 대입 연산자 중복 정의 (0) | 2016.04.15 |
[C++] 클래스에 연산자 중복 정의 (0) | 2016.04.15 |
[C++] 연산자 중복 정의 (0) | 2016.04.15 |
[C++] 하향 캐스팅 (0) | 2016.04.15 |
[C++] 메서드의 다형성 (0) | 2016.04.15 |
[C++] 개체의 다형성 (0) | 2016.04.15 |
[C++] 파생 시에 액세스 지정 (0) | 2016.04.15 |