728x90
operator overloading
하나의 연산자를 여러 의미로 사용할 수 있게 하는 것이다.
C++에서는 연산자 오버로딩을 사용자 정의 타입까지 확장할 수 있으며, 클래스도 하나의 타입임을 확실히 보여준다.
operator function(연산자 함수)
C++에서는 연산자를 오버로딩하기 위해서 연산자 함수라는 것을 사용한다.
operator오버로딩할연산자(매개변수 ...)
연산자 함수는 operator 키워드를 사용하여 연산자를 오버로딩한다.
오버로딩할 연산자는 적법한 C++ 연산자이며, operator키워드와 공백 없이 연결되어 표시해야 한다.
오버로딩 제약 사항
- 전혀 새로운 연산자를 정의할 수 없다.
- ex) 몫을 나타내기 위한 %%라는 연산자를 새롭게 정의할 수 없다
- 기본 타입을 다루는 연산자의 의미는 재정의할 수 없으며, 따라서 오버로딩된 연산자의 피연산자 중 하나는 반드시 사용자 정의 타입이어야한다.
- ex) 두 개의 double형에 대한 덧셈 연산자가 뺄셈을 수행하도록 오버로딩할 수 없다
- 오버로딩된 연산자는 기본 타입을 다루는 경우에 적용되는 피연산자의 수, 우선순위 및 그룹화를 준수해야 한다.
- ex) 나눗셈 연산자는 이항 연산자이므로 단항 연산자로 오버로딩할 수 없다.
- 오버로딩된 연산자는 디폴트 인수를 사용할 수 없다.
입출력 연산자 오버로딩(<<, >>)
cout << A;
만약 A가 특정 클레스라면, 위 출력되지 않을 것이다. 즉, cout과 A가 같은 타입의 객체라면 가능한 코드이다.
cout은 ostream이라는 클래스 형의 오브젝트이다.
ostream& operator <<(ostream&, const 클레스이름&);
위와 같이 비멤버 형태로 연산자 오버로딩이 가능하다.
예를 들어보자.
// 클레스.hpp
class 클래스이름
{
...
};
...
ostream& operator <<(ostream& outputStream, const 클레스이름& A);
istream& operator >>(istream& inputStream, const 클레스이름& B);
...
// 클레스.cpp
...
ostream& operator <<(ostream& outputStream, const 클래스이름& A)
{
cout << "(" << A.getValue() <<")";
return outputStream;
}
istream& operator >>(istream& inputStream, const 클래스이름& B)
{
int tmp;
cin >> tmp;
B.setValue(tmp);
return inputStream;
}
...
오버로딩한 함수에서 반환값을 보면 istream, ostream 형태이다.
만약 cout << 클레스이름 처럼 불렀을 때 처음 cout이 outputStream에 들어가고 이 값이 레펀스형 반환값으로 다시 리턴되어 연산하게 된다.
728x90
300x250