Minwoo Dev.

[C++] 후위 증감연산자 오버로딩, pos++, pos-- 본문

C++

[C++] 후위 증감연산자 오버로딩, pos++, pos--

itisminu 2024. 7. 19. 11:50
728x90
반응형
SMALL

후위 연산자

  • 해당 라인의 다른 연산이 모두 끝나고 나서 증감연산자를 계산한다는 특징이 있다.
  • 반환은 현재 값, 그리고 원래 값은 1 증가시키는 형태이다.

 

이러한 후위 연산자는 단순히 1을 증가시키거나 감소시키는 것이 아니라 반환은 증감 전의 값, 반환과 별개로 원래의 값을 증감시켜야 하기 때문에 보다 복잡하다고 생각할 수 있다.

 

 

operator++ (O)
++operator (X)

 

연산자 오버로딩을 할 때는 operator 뒤에 무조건 오버로딩할 연산자를 작성해야 한다.

이러한 이유 때문에 전위 연산자와 후위 연산자를 구분하지 못하는 문제점도 발생한다.

 

 

이러한 문제점들을 해결할 방법을 코드를 통해 알아보자.

 

 


 

후위 연산자 오버로딩

  • operator++(매개변수, int)
  • operator--(매개변수, int)
  • int를 매개변수 뒤에 기입하여 후위 연산자임을 표시

 

operator++(매개변수, int)

#include<iostream>
using namespace std;

class Point{
private:
    int xpos, ypos;
public:
    Point(int x = 0, int y = 0):xpos(x),ypos(y){}
    void ShowPosition() const{
        cout << '[' << xpos << ", " << ypos << ']' << endl;
    }
};


int main(void){
    Point pos1(3, 4);
    Point pos2 = pos1++;
    pos1.ShowPosition();
    pos2.ShowPosition();
    return 0;
}

 

 

멤버함수로의 연산자 오버로딩

#include<iostream>
using namespace std;

class Point{
private:
    int xpos, ypos;
public:
    Point(int x = 0, int y = 0):xpos(x),ypos(y){}
    void ShowPosition() const{
        cout << '[' << xpos << ", " << ypos << ']' << endl;
    }
    Point operator++(int){ // 후위 증가연산자 오버로딩!!
        Point pos(xpos, ypos);
        xpos += 1;
        ypos += 1;
        return pos;
    }
};


int main(void){
    Point pos1(3, 4);
    Point pos2 = pos1++;
    pos1.ShowPosition();
    pos2.ShowPosition();
    return 0;
}

 

실행 결과

 

 

반환될 값은 변경하지 않은 값이고, 별개로 기존의 값을 변경해야 하므로 위처럼 작성할 수 있다.

 

Point operator++(int){
        Point pos(xpos, ypos);
        xpos += 1;
        ypos += 1;
        return pos;
    }

 

매개변수에 int라고 기입하여 후위 연산자임을 표시하였다.

 

즉, 

pos1++;

위 코드가

pos1.operator++(int);

로 바뀌어 실행되는 것이다.

 

 

 

전역 변수로의 연산자 오버로딩

#include<iostream>
using namespace std;

class Point{
private:
    int xpos, ypos;
public:
    Point(int x = 0, int y = 0):xpos(x),ypos(y){}
    void ShowPosition() const{
        cout << '[' << xpos << ", " << ypos << ']' << endl;
    }
    friend Point operator++(Point &p, int);
};

Point operator++(Point &p,int){
    Point pos(p.xpos, p.ypos);
    p.xpos += 1;
    p.ypos += 1;
    return pos;
}

int main(void){
    Point pos1(3, 4);
    Point pos2 = pos1++;
    pos1.ShowPosition();
    pos2.ShowPosition();
    return 0;
}

 

실행 결과

 

전역함수도 위처럼 작성하면 된다.

 


operator--(매개변수, int)

#include<iostream>
using namespace std;

class Point{
private:
    int xpos, ypos;
public:
    Point(int x = 0, int y = 0):xpos(x),ypos(y){}
    void ShowPosition() const{
        cout << '[' << xpos << ", " << ypos << ']' << endl;
    }
};


int main(void){
    Point pos1(3, 4);
    Point pos2 = pos1--;
    pos1.ShowPosition();
    pos2.ShowPosition();
    return 0;
}

 

 

멤버 함수로의 연산자 오버로딩

#include<iostream>
using namespace std;

class Point{
private:
    int xpos, ypos;
public:
    Point(int x = 0, int y = 0):xpos(x),ypos(y){}
    void ShowPosition() const{
        cout << '[' << xpos << ", " << ypos << ']' << endl;
    }
    Point operator--(int){
        Point pos(xpos, ypos);
        xpos -= 1;
        ypos -= 1;
        return pos;
    }
};


int main(void){
    Point pos1(3, 4);
    Point pos2 = pos1--;
    pos1.ShowPosition();
    pos2.ShowPosition();
    return 0;
}

 

실행 결과

 

 

 

전역 함수로의 연산자 오버로딩

#include<iostream>
using namespace std;

class Point{
private:
    int xpos, ypos;
public:
    Point(int x = 0, int y = 0):xpos(x),ypos(y){}
    void ShowPosition() const{
        cout << '[' << xpos << ", " << ypos << ']' << endl;
    }
    friend Point operator--(Point &p, int);
};

Point operator--(Point &p,int){
    Point pos(p.xpos, p.ypos);
    p.xpos -= 1;
    p.ypos -= 1;
    return pos;
}

int main(void){
    Point pos1(3, 4);
    Point pos2 = pos1--;
    pos1.ShowPosition();
    pos2.ShowPosition();
    return 0;
}

 

실행 결과

 

 

 

 

 

 

정리하자면, 후위 연산자 오버로딩을 할 때에는 매개변수 마지막에 int와 같이 후위 연산자라는 표시를 해야한다.
728x90
반응형
LIST