티스토리 뷰
반응형
🔼 C++ 증감 연산자 오버로딩
✅ 1. 증감 연산자란?
C++에서 자주 쓰이는 ++
, --
연산자는 다음 두 가지 방식으로 사용됩니다.
전위(prefix)
++a; // 먼저 증가시킨 후, 그 결과값을 사용
후위(postfix)
a++; // 원래 값을 사용한 후, 나중에 증가시킴
예를 들어:
int a = 3;
int b = ++a; // b = 4, a = 4
int c = a++; // c = 4, a = 5
❓ 왜 전위/후위를 나눠야 하나요?
사용자 정의 클래스에서도 ++
를 쓰고 싶을 때,
컴파일러는 ++
의 위치에 따라 다른 동작을 기대합니다.
하지만 컴파일러 입장에서 둘 다 operator++()
로 보이기 때문에
전위/후위를 명확히 구분해서 정의하지 않으면 오류나 예기치 않은 동작이 발생합니다.
🎯 해결: 함수 시그니처로 구분한다
✔️ 후위 버전은 인자를 받는 척
int
하나를 넣습니다 (실제로는 아무 의미 없음).
이int
는 오직 전위와 후위를 구분하기 위한 문법적 장치입니다.
💻 예제: 전위/후위 ++
, --
연산자 오버로딩
🧾 이 코드의 목적
Point
클래스에 대해 전위 및 후위++
,--
를 오버로딩- 각각 어떤 방식으로 동작하는지 명확하게 구분
- 객체를 출력할 수 있도록
<<
연산자도 함께 오버로딩
#include <iostream>
using namespace std;
class Point {
public:
int x, y;
Point(int x = 0, int y = 0) : x(x), y(y) {}
// 전위 증가
Point& operator++() {
++x;
++y;
return *this;
}
// 후위 증가
Point operator++(int) {
Point temp = *this; // 복사본 저장
x++;
y++;
return temp; // 복사본 반환
}
// 전위 감소
Point& operator--() {
--x;
--y;
return *this;
}
// 후위 감소
Point operator--(int) {
Point temp = *this;
x--;
y--;
return temp;
}
// 출력 연산자 오버로딩
friend ostream& operator<<(ostream& os, const Point& p) {
os << "(" << p.x << ", " << p.y << ")";
return os;
}
};
int main() {
Point p(1, 2);
cout << "원래 p: " << p << endl;
cout << "++p (전위): " << ++p << endl;
cout << "p++ (후위): " << p++ << endl;
cout << "변경된 p: " << p << endl;
cout << "--p (전위): " << --p << endl;
cout << "p-- (후위): " << p-- << endl;
cout << "최종 p: " << p << endl;
}
🧠 코드 해설
✅ 실행 결과
원래 p: (1, 2)
++p (전위): (2, 3)
p++ (후위): (2, 3)
변경된 p: (3, 4)
--p (전위): (2, 3)
p-- (후위): (2, 3)
최종 p: (1, 2)
🚨 주의할 점 요약
※ 후위 연산자에서 Point temp = *this
는 반드시 필요합니다.
→ 변경되기 전의 값을 반환해야 하기 때문입니다.
✅ 마무리 요약
- 증감 연산자
++
,--
는 전위/후위로 나뉘며 의미와 구현이 다릅니다. - 전위: 바로 값을 바꾸고 그 결과를 반환 (
Point& operator++()
) - 후위: 변경 전 값을 복사해서 반환하고 나중에 바꿈 (
Point operator++(int)
) - 두 버전을 명확히 구분해야 STL 및 사용자 코드를 안정적으로 작성할 수 있습니다.
반응형
'홍정모 따라 배우는 C++ > C++ 오버로딩' 카테고리의 다른 글
C++ 비교 연산자 오버로딩: 객체를 ==, < 등으로 비교하려면? (0) | 2025.06.12 |
---|---|
C++ 단항 연산자 오버로딩: 객체 하나에 작동하는 연산 정의하기 (0) | 2025.06.12 |
C++ 입출력 연산자 오버로딩: 객체도 cin, cout 으로 다룰 수 있을까? (0) | 2025.06.11 |
C++ 산술 연산자 오버로딩: 숫자처럼 객체를 더하려면? (0) | 2025.06.11 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 객체지향
- 인접 행렬
- 그리디
- 동적 계획법
- 코딩 테스트
- 브루트포스
- C++
- 동적계획법
- 코딩
- 문제풀이
- 그래프 탐색
- 코딩테스트
- C++ 알고리즘
- 백준
- 그리디알고리즘
- 문제 풀이
- c++알고리즘
- 프로그래밍
- dfs
- 알고리즘기초
- Python
- DP
- 문자열처리
- 알고리즘문제풀이
- c언어
- 알고리즘
- 알고리즘 문제풀이
- 파이썬
- 파이썬코딩
- python 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
반응형