operator overloading : 하나의 연산자를 여러 의미로 사용할 수 있게 하는 것이다. C++ 에서는 연산자 오버로딩을 사용자 정의 타입까지 확장할 수 있으며, 클래스도 하나의 타입임을 확실히 보여준다.
operator function (연산자 함수) : C++ 에서는 연산자를 오버로딩하기 위해서 연산자 함수라는 것을 사용한다.
연산자 함수는 operator 키워드를 사용하여 연산자를 오버로딩한다. 오버로딩할 연산자는 적법한 C++ 연산자이며, operator 키워드와 공백 없이 연결되어 표시해야 한다. (직접 해보니 공백 ? 상관 없는 거 같은데 ...)
오버로딩 제약 사항
- 전혀 새로운 연산자를 정의할 수 없다. (원래 있던 연산자)
- 기본 타입을 다루는 연산자의 의미는 재정의할 수 없으며, 따라서 오버로딩된 연산자의 피연산자 중 하나는 반드시 사용자 정의 타입이어야 한다.
- 오버로딩된 연산자는 기본 타입을 다루는 경우에 적용되는 피연산자의 수, 우선순위 및 그룹화를 준수해야 한다.
- 오버로딩된 연산자는 디폴트 인수를 사용할 수 없다.
참고 사이트 : C++ 연산자 오버로딩 : 네이버 블로그 (naver.com)
참고 사이트 : [C++] operator overloading(연산자 오버로딩) (tistory.com)
#include <iostream>
using namespace std;
class Numbers {
private:
int num1, num2;
public:
// 기본 생성자
Numbers() { ; }
// 생성자
Numbers(int num1, int num2) : num1(num1), num2(num2) { ; }
void ShowNumbers() { // 객체 정보를 확인하는 메소드
cout << "num1 : " << num1 << ", num2 : " << num2 << endl;
}
int operator + (int num) {
return num2 + num;
}
Numbers operator + (Numbers ref) {
int num1;
int num2;
num1 = this->num1 + ref.num1;
num2 = this->num2 + ref.num2;
Numbers ob(num1, num2);
return ob;
}
// 비교 연산자
bool operator < (Numbers ref) {
return (num1 + num2) < (ref.num1 + ref.num2);
}
// 비교 연산자
bool operator > (Numbers ref) {
return (num1 + num2) > (ref.num1 + ref.num2);
}
// == 를 구현해보자 [실습]
// 객체와 정수를 비교해주는 친구로 오버로딩 하자!
// 해당 객체의 두 번째 멤버변수와 매개변수로 넘어온 정수가 같다면
// true 리턴, 아니면 false 리턴
bool operator == (int num) {
return num2 == num;
}
// += 연산자 재정의
void operator += (int data) {
num1 += data;
num2 += data;
}
// 전위형
Numbers operator++ () {
++num1;
++num2;
return *this;
}
// 후위형
Numbers operator++ (int temp) { // 전위형과 후위형을 구분하기 위해 매개변수를 하나 작성
Numbers Temp = *this;
num1++;
num2++;
return Temp;
}
};
int main() {
Numbers ob1(4, 9);
// 피연산자 형식이 Numbers + int 라 안됨
// 따로 만들어줘야한다.
cout << ob1 + 5 << endl;
Numbers ob2(1, 3);
Numbers ob3 = ob1 + ob2;
ob3.ShowNumbers();
bool result1 = ob1 < ob2;
cout << result1 << endl; // 출력 0
bool result2 = ob1 > ob2;
cout << result2 << endl; // 출력 1
if (ob1 < ob2) {
cout << "ob2 객체의 변수들의 합이 더 큽니다." << endl;
}
else {
cout << "ob1 객체의 변수들의 합이 더 큽니다." << endl;
}
Numbers ob4(6, 9);
if (ob4 == 5) {
cout << "ob4 객체의 num2 변수와 값이 같습니다." << endl;
}
else {
cout << "ob4 객체의 num2 변수와 값이 같지 않습니다." << endl;
}
ob1.ShowNumbers();
ob1 += 7;
ob1.ShowNumbers();
ob3 = ++ob2;
ob3.ShowNumbers();
int num = 5;
cout << num++ << endl;
ob3 = ob2++;
ob3.ShowNumbers();
ob2.ShowNumbers();
return 0;
}
증감 연산자 (전위형, 후위형)
전위형 | 후위형 | |
파라미터 | void(없음) | int |
리턴값 | 객체 자체 | 임시 객체 |
속도 | 빠름 | 느림 |
'C++언어 공부 > 개념 공부' 카테고리의 다른 글
2024.02.05 C++ 언어 공부 9일 차 (template (1)) (0) | 2024.02.08 |
---|---|
2024.02.02 C++ 언어 공부 8일 차 (exception) (0) | 2024.02.08 |
2024.02.02 C++ 언어 공부 8일 차 (프렌드 추가내용) (1) | 2024.02.05 |
2024.02.01 C++ 언어 공부 7일 차 (프렌드) (0) | 2024.02.02 |
2024.02.01 C++ 언어 (인터페이스, 상속 실습) (0) | 2024.02.02 |