Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 증감 연산자(++, --) 오버로딩 완벽 가이드


C++에서 증가(++) 연산자와 감소(--) 연산자는 가장 중요한 단항(unary) 연산자 두 가지입니다. 이 연산자들을 클래스에 대해 오버로딩하면 사용자 정의 타입에서도 기본 타입처럼 자연스럽게 값을 증감시킬 수 있습니다.

다음 예제는 전위(prefix) 방식과 후위(postfix) 방식 모두에 대해 증가(++) 연산자를 오버로딩하는 방법을 보여줍니다. 동일한 방식으로 감소(--) 연산자도 오버로딩할 수 있습니다.

핵심 개념: 전위와 후위를 구분하는 방법

컴파일러는 함수 매개변수의 유무로 두 버전을 구분합니다. 매개변수가 없으면 전위(++obj) 연산자로 해석하고, 더미(dummy) int 매개변수를 받으면 후위(obj++) 연산자로 해석합니다. 후위 연산자는 증가하기 전의 값을 먼저 저장해 두었다가, 객체를 증가시킨 후 저장해 둔 이전 값을 반환한다는 점이 핵심입니다.

예제 코드

#include <iostream>
using namespace std;

class Time {
   private:
   int hours;
   int minutes;

   public:
   Time(int h, int m) {
      hours = h;
      minutes = m;
   }

   void display() {
      cout << "H: " << hours << " M:" << minutes << endl;
   }

   // 전위(prefix) ++ 연산자 오버로딩
   Time operator++ () {
      ++minutes;              // 현재 객체 증가
      if(minutes >= 60) {
         ++hours;
         minutes -= 60;
      }
      return Time(hours, minutes);
   }

   // 후위(postfix) ++ 연산자 오버로딩
   Time operator++( int ) {
      Time T(hours, minutes); // 증가 전 상태 저장

      // 현재 객체 증가
      ++minutes;

      if(minutes >= 60) {
         ++hours;
         minutes -= 60;
      }

      // 증가하기 전의 원래 값 반환
      return T;
   }
};

int main() {
   Time T1(11, 59), T2(10, 40);

   ++T1;   // 전위 증가
   T1.display();
   ++T1;
   T1.display();

   T2++;   // 후위 증가
   T2.display();
   T2++;
   T2.display();
   return 0;
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다 −

H: 12 M:0
H: 12 M:1
H: 10 M:41
H: 10 M:42

코드 설명

전위(++T1): 분(minutes)을 먼저 증가시키고, 60분 이상이 되면 시간(hours)을 1 올린 뒤 분에서 60을 뺍니다. T1은 11시 59분에서 시작하므로 첫 번째 호출 후 12시 0분, 두 번째 호출 후 12시 1분이 출력됩니다.

후위(T2++): 증가하기 전의 상태를 별도의 객체 T에 저장한 뒤 현재 객체를 증가시키고, 저장해 둔 이전 값을 반환합니다. 이 예제에서는 반환값을 사용하지 않고 곧바로 display()를 호출했기 때문에 증가된 값이 화면에 표시됩니다. T2는 10시 40분에서 시작하여 첫 호출 후 10시 41분, 두 번째 호출 후 10시 42분으로 출력됩니다.