오버로딩은 매개변수의 타입에 따라 구분되지만 전위/후위 연산자는 매개변수를 받지 않는 문제가 있음
문제를 해결하기 위해 후위 연산자는 int 타입의 인자를 받도록 하고, 컴파일러는 후위 증감 연산자가 호출될 때 0을 전달
이름이 있는 매개변수를 사용하지 않으면 경고 메시지를 표시하기 때문에 이름을 제거
class UPInt
{
public:
UPInt&& operator++(); // 전위 ++
const UPInt operator++(int); // 후위 ++
UPInt& operator--(); // 전위 --
const UPInt operator--(int); // 후위 --
};
전위 연산자는 증감시키고 값을 사용하는 연산자이고, 후위 연산자는 값을 사용하고 증감시키는 연산자
UPInt& UPInt::operator++()
{
*this += 1;
return *this;
}
const UPInt UPInt::operator++(int)
{
const UPInt oldValue = *this;
++(*this);
return oldValue;
}
후위 연산자가 const 객체를 반환하는 이유는 연산자를 두 번 쓰는 경우 한 번만 적용되는데 이는 코드의 의미와 같지 않으므로 직관적이지 않고 헷갈리는 것을 방지하기 때문
따라서 operator++가 const 객체를 반환하여 처음 operator++에 의해 반환된 const 객체의 operator++를 호출하는데, 두 번째 operator++는 const가 아닌 멤버 함수이므로 호출할 수 없어 에러가 발생하도록 구현
UPInt i;
i++++; // i.operator++(0).operator++(0)이고, 실질적 의미는 i++와 같음
전위 연산자는 참조자 타입을 반환하고 후위 연산자는 const 객체 타입을 반환
후위 연산자는 전위 연산자에 비해 반환값을 위한 임시 객체 생성의 비용이 추가로 발생
후위 연산자는 반환 타입을 제외하면 전위 연산자와 하는 일이 같기 때문에 코드 중복을 피하는 목적으로 전위 연산자를 호출
'C++ > More Effective C++' 카테고리의 다른 글
[More Effective C++] 항목 8 new와 delete의 의미를 정확히 구분하고 이해하자 (0) | 2025.02.18 |
---|---|
[More Effective C++] 항목 7 &&, || 연산자는 오버로딩 대상이 절대로 아니다 (0) | 2025.02.17 |
[More Effective C++] 항목 5 사용자 정의 타입 변환 함수에 대한 주의를 놓지 말자 (0) | 2025.02.13 |
[More Effective C++] 항목 4 쓸데 없는 기본 생성자는 그냥 두지 말자 (0) | 2025.02.13 |
[More Effective C++] 항목 3 배열과 다형성은 같은 수준으로 놓고 볼 것이 아니다 (0) | 2025.02.11 |