-
[C++] 증감 연산자 오버로딩(전위 연산자, 후위 연산자)C++ 2019. 9. 4. 00:38
증감 연산자
증감 연산자는 피연산자로부터 값을 더하거나 빼기 위한 단항 연산자인데, 연산이 이루어지는 시점에 따라 전위 연산자, 후위 연산자로 나뉜다.
단순히 증감 연산자의 사용만이 목적이라면 연산이 이루어지는 시점만 알아도 사용이 가능하지만, 증감 연산자를 직접 오버로딩 하기 위해서는 내부가 어떻게 동작하는지에 대한 이해가 필요하다.
전위 연산자와 후위 연산자를 오버로딩한 아래의 예제를 보자.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152#include <iostream>using namespace std;class Point{private:double m_x, m_y, m_z;public:Point(double x = 0.0, double y = 0.0, double z = 0.0): m_x(x), m_y(y), m_z(z) {}// 전위 증가Point& operator++(){m_x += 1;m_y += 1;m_z += 1;return *this;}// 후위 증가Point operator++(int){Point temp(m_x, m_y, m_z);m_x += 1;m_y += 1;m_z += 1;return temp;}// 출력 연산자 오버로딩friend ostream& operator << (ostream &out, const Point &point){out << point.m_x << " " << point.m_y << " " << point.m_z;return out;}};int main(){Point p1(1.0, 2.0, 3.0);cout << ++p1 << endl; // 바로 증가cout << p1++ << endl; // 다음 행에서 증가cout << p1 << endl;}cs ※ 후위 연산자를 오버로딩 하기 위해서 매개 변수로 int를 넘기는데 이때 int는 특별한 의미를 가지는 것이 아니라 전위/후위 연산자의 구분을 위한 것이다.
단순히 "전위 연산자는 즉시 값을 증감 시키고, 후위 연산자는 다음 행에서 값을 증감시킨다" 라고 잘못 알고 있는 경우가 있는데 내부를 살펴보면 사실 전위 연산자든 후위 연산자든 값의 증감은 즉시 이루어진다.
즉 차이는 반환할 때 발생한다. 전위 연산자는 증감된 값을 참조형으로 반환하지만 후위 연산자는 값은 증가시키지만 증감 전의 값을 임시 객체로 만들어서 반환한다. 그래서 증감된 값은 다음 행에서야 사용할 수 있는 것이다.
전위 연산자 vs 후위 연산자의 속도 차이
전위 연산자는 값의 참조형을 반환 하지만 후위 연산자는 임시 객체를 만드는 과정이 추가된다. 일반적인 자료형의 경우 큰 차이가 없을 수 있지만 사용자 정의 자료형의 경우 클래스의 멤버 변수들을 전부 복사해야 하므로 그만큼 느려지게 된다. 이런 경우 전위 연산자를 사용하면 속도 면에서 이득을 볼 수 있다.
'C++' 카테고리의 다른 글
[C++] 문자열(string) 자르기 (0) 2023.06.16 C++ 반복자(iterator), vector와 list의 반복자 비교 (0) 2021.10.18 [C++] this 포인터 (0) 2019.08.29 [C++] 함수 포인터 (0) 2019.08.27 [C++] Tuple (복수의 값 반환) (1) 2019.08.22