이번에는 증감 연산자 중복 정의를 하는 방법을 살펴보기로 할게요. 아시는 것처럼 증감 연산자는 단항 연산자로 전위에 올 때와 후위에 올 때 연산 결과가 다릅니다. 전위에 올 때는 값을 증감한 자기 자신이 연산 결과이고 후위에 올 때는 변경하기 전의 자신의 값입니다.
따라서 전위 증감 연산자의 반환 형식은 자기 자신을 전달하기 위해 클래스 형식 &를 사용합니다. 그리고 후위 증감 연산자의 반환 형식은 증감하기 전 자신의 값을 복사한 개체를 상수 값으로 반환하기 위해 const 클래스 형식을 사용합니다.
C++에서 증감 연산자 중복 정의할 때 전위인지 후위인지 구분하기 위해 후위 증감 연산자 중복 정의할 때는 스텁 매개 변수를 추가로 받게 정의합니다. 다음은 Score 클래스에서 ++ 연산자를 전위와 후위로 중복 정의할 때의 원형입니다.
Score & operator++(); //전위 ++ 연산자 중복 정의 const Score operator++(int); //후위 ++ 연산자 중복 정의
0~100점 사이의 값을 갖는 성적 클래스를 정의하고 증감 연산자 중복 정의하는 예제를 보여드릴게요.
//Score.h #pragma once #include <iostream> using namespace std; class Score { int value; public: static const int max_score; static const int min_score; static const int not_score; Score(int value); int GetValue()const; //값 접근자 void Increment();//값 1 증가 void Decrement();//값 1 감소 Score &operator++(); //전위 ++ 연산자 중복 정의 const Score operator++(int); //후위 ++ 연산자 중복 정의 Score &operator--(); //전위 -- 연산자 중복 정의 const Score operator--(int); //후위 -- 연산자 중복 정의 private: void SetValue(int value);//값 설정자 };
//Score.cpp #include "Score.h" const int Score::max_score=100; const int Score::min_score=0; const int Score::not_score=-1; Score::Score(int value) { SetValue(value); } int Score::GetValue()const { return value; } void Score::Increment() { if(value<max_score) { value++; } } void Score::Decrement() { if(value>min_score) { value--; } } Score &Score::operator++() //전위 ++ 연산자 중복 정의 { Increment(); return (*this); } const Score Score::operator++(int) //후위 ++ 연산자 중복 정의 { Score score(*this); Increment(); return score; } Score &Score::operator--() //전위 -- 연산자 중복 정의 { Decrement(); return (*this); } const Score Score::operator--(int) //후위 -- 연산자 중복 정의 { Score score(*this); Decrement(); return score; } void Score::SetValue(int value) { if((value<min_score)||(value>max_score)) { value = not_score; } this->value = value; }
//증감 연산자 중복 정의 #include "Score.h" int main() { Score score(20); cout<<"score "<<score.GetValue()<<" 후위 ++"<<endl; Score re = score++; cout<<"score: "<<score.GetValue()<<" 연산 결과:"<<re.GetValue()<<endl; cout<<"score "<<score.GetValue()<<" 전위 ++"<<endl; re = ++score; cout<<"score: "<<score.GetValue()<<" 연산 결과:"<<re.GetValue()<<endl; return 0; }
▷ 실행 결과
score 20 후위 ++
score: 21 연산 결과:20
score 21 전위 ++
score: 22 연산 결과:22