언어 자료구조 알고리즘/디딤돌 C++

[C++] 48. 증감 연산자 중복 정의

언제나휴일 2016. 4. 25. 01:18
반응형


증감 연산자 중복 정의

이번에는 증감 연산자 중복 정의를 하는 방법을 살펴보기로 할게요.

 

아시는 것처럼 증감 연산자는 단항 연산자로 전위에 올 때와 후위에 올 때 연산 결과가 다릅니다. 전위에 올 때는 값을 증감한 자기 자신이 연산 결과이고 후위에 올 때는 변경하기 전의 자신의 값입니다. 따라서 전위 증감 연산자의 반환 형식은 자기 자신을 전달하기 위해 클래스 형식 &를 사용합니다. 그리고 후위 증감 연산자의 반환 형식은 증감하기 전 자신의 값을 복사한 개체를 상수 값으로 반환하기 위해 const 클래스 형식을 사용합니다.

 

C++에서 증감 연산자 중복 정의할 때 전위인지 후위인지 구분하기 위해 후위 증감 연산자 중복 정의할 때는 스텁 매개 변수를 추가로 받게 정의합니다.

 

다음은 Score 클래스에서 ++ 연산자를 전위와 후위로 중복 정의할 때의 원형입니다.

Score & operator++(); //전위 ++ 연산자 중복 정의

const Score operator++(int); //후위 ++ 연산자 중복 정의

 

0~100점 사이의 값을 갖는 성적 클래스를 정의하고 증감 연산자 중복 정의하는 예제를 보여드릴게요.


48. 증감 연산자 중복 정의.zip


//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

반응형