-
2024 - 01 - 30 C++ Grammar D+6Language Grammar/C++ 2024. 1. 30. 19:08
*연산자 오버로딩
+ 연산자를 예로 들면 정수 + 정수 일때는 int +(int, int)가 오버로딩되어 쓰일것이고,
실수 + 실수 일때는 double +(double, double) 이 오버로딩되어 쓰인다.
C++ 은 언어 차원에서 복소수를 지원하지 않기 때문에 복소수끼리 더하는 방법은 클래스를 만든 사람이 직접 정의를 해줄 필요가 있다.
만약 Complex 라는 클래스에서 + 연산자에 오버로딩을 하고 싶으면
Complex +(Complex, Complex);
이것으로 Complex 클래스안에서 + 연산자에 대한 오버로딩이 가능하다.
*연산자 함수
Time을 예로 들떄, + 연산자를 사용하였을때 시간, 분, 초 다 따로 더한 다음, 60이 넘는 시간,분,초는 자동으로 올려줘야 하기 때문에
+ 연산자에 대해 오버로딩하는 함수가 필요하다.
실습코드
#include <iostream>
class Time
{
private:
int hour, min, sec;
public:
Time(){}
Time(int h, int m, int s) { hour = h; min = m; sec = s; }
void OutTime()
{
printf("%d : %d : %d\n", hour, min, sec);
}
const Time AddTime(const Time& T) const {
Time R;
R.sec = sec + T.sec;
R.min = min + T.min;
R.hour = T.hour;
R.min += R.sec / 60;
R.sec %= 60;
R.hour += R.min / 60;
R.min %= 60;
return R;
}
};
void main()
{
Time A(1, 1, 1);
Time B(2, 2, 2);
Time C;
A.OutTime();
B.OutTime();
C = A.AddTime(B);
C.OutTime();
}
하지만 이러한 방식은 연산자를 쓰는 방법에 비해 직관적이지 못하며 기본형의 연산문과 모양이 다르다는 것도 불편하다.
그래서 이런 동작을 하는 연산자 함수를 정의할 수 있다.
*연산자 함수의 형식
리턴타입 Class::operator 연산자(인수 목록)
{
함수 본체;
}
예를 들어서 이전코드에서
const Time AddTime(const Time& T) const -> const Time operator +(const Time& T) const 로 바꿀수 있다.
기존 함수이름 -> 연산자로 바꾼다음 앞에 operator를 붙여준다.
호출시 A,B,C 라는 객체가 있으면
C안에 A 와 B의 시간을 더한 값을 집어넣고 싶으면
C = A.operator +(B) 또는 C = A+B 라고 호출할 수 있다.'Language Grammar > C++' 카테고리의 다른 글
2024 - 02 - 07 C++ 코딩테스트 10주완성 D+2 (0) 2024.02.07 2024 - 02 - 05 C++ 코딩테스트 10주완성 D+1 (1) 2024.02.05 2024 - 01 - 23 C++ Grammar D+5 (0) 2024.01.23 2024 - 01 - 22 C++ Grammar D+4 (0) 2024.01.22 2024 - 01 - 18 C++ Grammar D+3 (0) 2024.01.18