복소수 덧셈과 연산자 오버로딩
실수부(real)와 허수부(imaginary)를 멤버 변수로 가지는 복소수 클래스가 있다고 가정해 보겠습니다. 이 클래스의 두 객체를 더하려면 더하기(+) 연산자를 오버로드해야 하며, 아울러 복소수를 읽기 좋은 형식으로 반환해 주는 함수도 함께 정의해야 합니다.
예를 들어 입력이 c1 = 8 - 5i, c2 = 2 + 3i라면, 두 수를 더한 결과인 10 - 2i가 출력되어야 합니다.
문제 해결 접근 방법
- + 연산자를 오버로드하고, 인자로 다른 복소수 객체 c2를 전달받습니다.
- 실수부와 허수부가 모두 0으로 초기화된 복소수 객체 ret을 생성합니다.
- ret의 실수부 = 자신의 실수부 + c2의 실수부
- ret의 허수부 = 자신의 허수부 + c2의 허수부
- ret 객체를 반환합니다.
예제 코드
다음 구현 예제를 통해 동작 원리를 더 자세히 이해해 보겠습니다.
#include <iostream>
#include <sstream>
#include <cmath>
using namespace std;
class Complex {
private:
int real, imag;
public:
Complex(){
real = imag = 0;
}
Complex (int r, int i){
real = r;
imag = i;
}
string to_string(){
stringstream ss;
if(imag >= 0)
ss << "(" << real << " + " << imag << "i)";
else
ss << "(" << real << " - " << abs(imag) << "i)";
return ss.str();
}
Complex operator+(Complex c2){
Complex ret;
ret.real = real + c2.real;
ret.imag = imag + c2.imag;
return ret;
}
};
int main(){
Complex c1(8,-5), c2(2,3);
Complex res = c1 + c2;
cout << res.to_string();
}
코드 설명
operator+ 함수는 호출한 객체(c1)의 실수부·허수부에 각각 c2의 실수부·허수부를 더한 값을 가지는 새로운 Complex 객체를 생성해 반환합니다. to_string() 함수는 허수부의 부호에 따라 "(a + bi)" 또는 "(a - bi)" 형태의 문자열을 만들어 출력 형식을 일관되게 유지해 줍니다.
입력
c1(8,-5), c2(2,3)
출력
(10 - 2i)