Minwoo Dev.
[C++] 후위 증감연산자 오버로딩, pos++, pos-- 본문
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
'C++' 카테고리의 다른 글
[C++] << 연산자 오버로딩, >> 연산자 오버로딩 , istream, ostream (1) | 2024.07.19 |
---|---|
[C++] 연산자 오버로딩에서의 교환법칙 (0) | 2024.07.19 |
[C++] 전위 증감 연산자 오버로딩, ++pos, --pos (0) | 2024.07.19 |
[C++] 연산자 오버로딩이란, +-*/ 연산자 오버로딩 방식 (0) | 2024.07.19 |
[C++] 윤성우의 열혈 C++ 10-3 입력을 위한 >> 연산자의 오버로딩 문제풀이 (0) | 2024.07.18 |