쾌락없는 책임 (공부)/C++ 짜잘이

C++ 에서 증감 연산자 오버로딩, 전위, 후위 연산자를 구별하는 방법

허스크 2022. 1. 11. 22:40
반응형
참고하면 좋은 곳
 

Purpose of Dummy Parameter in Postfix Operator Overload? c++

When overloading the postfix operator, I can do something simple like Class Foo { private: int someBS; public: //declaration of pre &postfix++ Foo operator++(); //rest of class not

stackoverflow.com

 

 

전위, 후위를 더미로만 구분해서 오버로딩
class Example{
private:
	int m_val;
public:
	Example operator++();
};

위 예시 클래스에서 증감 연산자를 오버로딩 한다고 하면 아래와 같이 만들어 집니다.

// 전위 연산자
Example Example::operator ++ (){
	++m_val;
    return *this;
}


// 후위 연산자
Example Example::operator ++ (int){
	Example temp(m_val);
    ++(*this);
    return temp;
}

 티스토리의 미칠듯한 줄바꿈으로 이상하게 보이지만 증감연산자를 오버로딩할 때 전위의 경우 그냥 operator ++ () 이고 후위 연산자의 경우 operator ++ (int) 같은 int 매개변수가 추가적으로 들어가 있습니다. (매개변수명은 없어도 됩니다, 어차피 더미라서)

 

 일단 저 과정에서 후위 연산자는 보통 이 연산이 끝난 다음 lvalue 값을 +1 이므로 왜 저런식으로 동작하는지는 잘 알 수 있습니다. 그런데 int 같은 더미가 왜 들어가냐는 것이죠.

 

 찾아본 결과 오버로딩시 구분을 위해 컴파일러에게 알려주는 장치라고 볼 수 있습니다. 실제로 함수를 오버로딩할 때 함수의 리턴 타입으로는 오버로딩 구분을 할 수 없습니다. 이로 인해서 ++, -- 의 경우 전위 연산자는 l-value가 리턴, 후위 연산자의 경우 r-value가 리턴이 되므로 오버로딩 과정에서 이 둘을 구별할 장치가 없는 것입니다. 그래서 더미가 있으면 후위 연산자, 없으면 전위 연산자로 구분할 수 있게 해준 것이죠.

 

 실제로 코드로 보면 int가 하는 일은 없기 때문에 단순히 '후위 연산자임을 알려주는 장치'로 사용되었다고 이해하면 될 것 같습니다.

반응형