본문 바로가기

C++

[C++] 연산자 오버로딩

위는 연산자 오버로딩 할 때 사용하는 연산자 함수의 원형이다.

 

인수는 대상에 더해지는 값, 피연산자이다. 

Complex의 레퍼런스가 아니라 Complex 자체를 인수로 해도되지만 크기가 클수록 속도가 느려지기 때문에

속도가 빠른 레퍼런스를 이용한다. 포인터를 사용할 수도 있지만 포인터를 사용하면 계산식이 A+(&B)처럼 더러워지기 때문에 A+B처럼 가독성이 좋은 레퍼런스를 이용한다. 또한 피연산자는 바꿀일이 없기 때문에 const로 지정한다.

함수 맨 뒤에 const를 붙임으로써 상수 함수로 지정을 했는데 그 이유는 A+B를 할 때 A가 바뀌지 않아야 하기 때문이다.

 

const Complex operator +(const Complex &T) const {
        Complex R;
        R.image = image + T.image;
        R.real = real + T.real;
        return R;
    }

위 코드는 연산자 함수의 정의부인데, Complex R이라는 임시객체를 사용한다.

인수인 Complex 레퍼런스를 사용한다면 인수의 값이 바뀌어버리기 때문이다.(A+B에서 B가 바뀜)

임시객체를 만들고 호출 객체는 건드리지 않기 때문에 상수 함수 함수가 된다. 

 

리턴 타입도 상수형이어야 하는데 상수형이 아니라면 우변값이 아닌 좌변값이 가능하단건데

그러면 A+B=5 같이 기껏 더했더니 다른 값으로 바꾸어 버릴 수가 있다.

 

정리

 

const Complex operator +(const Complex &T) const {
     return Complex(real+T.real, image+T.image);
}

기존 연산자 함수를 생성자를 활용하면 이렇게 간단하게 표기할 수 있다.

 

전역 연산자 함수

지금까지 작성한 것은 클래스 안에 작성되는 멤버 연산자 함수인데, 클래스 밖에서도 전역 연산자 함수로 선언할 수 있다. 대신 인수를 두개 써서 더해지는 것과 더하는 것 모두 인수로 작성해야 한다.

'C++' 카테고리의 다른 글

[C++] 상속받은 멤버 초기화  (0) 2022.01.05
[C++] 복사 생성자  (0) 2022.01.04
[C++] 프렌드 friend  (0) 2022.01.04
[C++] 디폴트 인수  (0) 2022.01.04
[C++] 인라인 함수  (0) 2022.01.03