연산자 자체를 일종의 함수로 생각해서 작성하면 된다.
이론보다는 실제로 쳐보는 것이 가장 빠르게 익숙해지는 길이다.
예시 1
cpp
// a + b를 오버로딩한다고 가정해보자.
// - a.plus(b)가 된다고 생각하면 됨.
// - 따라서 반환타입은 a의 타입에 맞춰서 가면 됨.
iClass operator+(const iClass &b) const
{
Myclass result = this.value + b.value;
return result;
}
예시 2
cpp
// a << b를 오버로딩한다고 보자.
// - << 는 출력에 주로 사용된다. (리눅스의 redirection)
// - a는 출력에 사용되는 객체. 따라서 타입은 std::ostream이 될 것.
// - 반환값의 타입은 a에 맞춰준다.
// - b는 내용물에 관련된 객체. 따라서 타입은 Iclass가 될 것.
// - 또한 그 내용이 변형되면 안 되므로 const 키워드를 붙인다.
// - 자원낭비를 줄이기 위해 레퍼런스로 소환한다.
std::ostream &operator<<(std::ostream &os, const Iclass &obj)
{
os << "Data : " << obj.data;
return os;
}
결론
-
원래 연산자의 기능을 생각해봐야 한다.
-
왼쪽에서 오른쪽으로 (→) 진행된다고 생각한다.
예시 :
a << b → operator<<(std::ostream &a, const Iclass &b) -
들어가는 인자들은 보통 객체이므로, 자원낭비를 줄이기 위해 레퍼런스로 소환한다.
-
들어가는 인자들이 변형되면 안되므로 const 키워드를 꼭 붙여준다.