ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2024 - 01 - 30 C++ Grammar D+6
    Language 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 라고 호출할 수 있다.






















Designed by Tistory.