Language Grammar/C++

2024 - 01 - 30 C++ Grammar D+6

Jang_^ 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 라고 호출할 수 있다.