※ LIG Nex1 The SSEN Embedded SW School에서 진행된 내용을 정리한 포스팅입니다.
연산자 오버로딩
- 연산자의 기능을 사용자 정의 클래스에 적용하는 것
- 연산자의 기본 기능을 저해하면 안된다.
- `+`, `-`, `/`, `%`, `<<`, `==` 등
- 클래스의 멤버 함수로 정의하거나 전역함수로 정의할 수 있다.
파이프 라인 연산자(<<)와 더하기 연산자(+) 오버로딩 예제
- main문에서 a + b 호출 시 a의 멤버 함수로 operator+(b)가 호출된다.
a.operator+(b); // a + b와 동일하다.
- ostream에 Point라는 사용자 정의 클래스를 오버라이딩 할 수 없으므로 전역으로 오버라이딩한다.
- 전역에서 호출하고 있지만 멤버 변수에 접근이 가능하도록 하기 위해 friend 키워드를 설정했다.
friend 키워드는 객체지향을 부순다. 사용을 지양하자.
class Point {
private:
int x, y;
public:
Point():x(0), y(0) {}
Point(int x, int y):x(x),y(y) {}
Point operator+(const Point &rhs) {
return Point(x + rhs.x, y + rhs.y);
}
friend ostream& operator<<(ostream &out, Point const& data);
};
ostream& operator<<(ostream &out, Point const& data) {
out << "(" << data.x << "," << data.y << ")";
return out;
}
int main(int) {
Point a;
Point b(10, 20);
cout << a + b << endl;
return 0;
}
- operator +를 전역으로 오버라이딩 할 수도 있다.
class Point {
private:
int x, y;
public:
Point():x(0), y(0) {}
Point(int x, int y):x(x),y(y) {}
friend Point operator+(const Point &p1, const Point &p2);
};
Point operator+(const Point &p1, const Point &p2) {
Point res(p1.x + p2.x, p1.y + p2.y);
return res;
}
operator= 오버라이딩
- 구현하지 않을 시, 컴파일러가 생성해주는 default 복사 대입 연산이 수행될 수 있다.
- default 복사 생성자와 동일한 문제가 발생할 수 있다.
- 현재 클래스 내부에 동적할당 받은 메모리가 있을 시, 주소값을 잃어버리기 때문에 메모리 누수 문제가 발생할 수 있다.
오버로딩에서의 const 활용
- 멤버 함수의 const의 유무는 오버로딩의 조건이 된다.
Point &operator[](int idx) {
if (idx < 0 || idx >= size)
exit(1);
return arr[idx];
}
Point &operator[](int idx) const {
if (idx < 0 || idx >= size)
exit(1);
return arr[idx];
}
※ 질문, 개선점, 오류가 있다면 댓글로 남겨주세요 :)
'Language > C++' 카테고리의 다른 글
[TheSSEN/C++] 11. 예외 처리 (0) | 2025.01.31 |
---|---|
[TheSSEN/C++] 10. 템플릿 (0) | 2025.01.29 |
[TheSSEN/C++] 8. 다형성 (0) | 2025.01.27 |
[TheSSEN/C++] 7. 상속 (0) | 2025.01.27 |
[TheSSEN/C++] 6. static과 singleton 패턴 (0) | 2025.01.27 |