기본틀
http://gaetaeng.tistory.com/33
[Operator Overloading][Operator][Overloading][복소수][complexNumber][1]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | int main() { ComplexNumber a(3.1,5.4); ComplexNumber b(1.6,1.3); ComplexNumber c; a.print(); b.print(); //양수 계산 c = a + b; c.print(); //음수 계산 c = a - b; c.print(); //실수부분 추출 double r = a.real(); cout << "실수 출력 :: " << r << endl; double i = a.imaginary(); cout << "허수 출력 :: " << i << endl; ComplexNumber e; e = a * b; e.print(); } | cs |
이런식으로 항상 print() 라는 함수를 사용해왔다.
그런데 우리는 그저
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | int main() { ComplexNumber a(3.1,5.4); ComplexNumber b(1.6,1.3); ComplexNumber c; cout << a << endl; cout << b << endl; //양수 계산 c = a + b; cout << c << endl; //음수 계산 c = a - b; cout << c << endl; //실수부분 추출 double r = a.real(); cout << "실수 출력 :: " << r << endl; double i = a.imaginary(); cout << "허수 출력 :: " << i << endl; ComplexNumber e; e = a * b; cout << e << endl; } | cs |
이런식으로 cout << c << endl 이런식으로 사용하기를 원한다.
이때 우리는 << 역시도 operator Overloading 이 가능하다.
[ + - * / | || ~ << >> > < == = ... 등등 ]
여기서 << 는 cout.operator<<(c) 가 원형이다.
여기서 좀더 확인을 해보면
operator<<(cout,c); 는 에러가 뜨지만
operator<<(cout,'a'); 는 에러가 뜨지 않는다.
cout << 'a'; 와 같음.
이것들은 라이브러리에 이미 구현이 되어있지만
사용자 정의 변수인 ComplexNumber 라는 타입은 사용자가 만든것이기 때문에 구현이 되있을리가 없다.
그렇기 때문에 사용자가 직접 구현을 해주어야지
cout << c << endl; 이 사용 가능하다.
그래서 전역변수로
1 2 3 4 5 | ostream& operator<<(ostream& o, ComplexNumber& x) { o << "( " << x.m_x << ", " << x.m_y << " )" << endl; return o; } | cs |
이렇게 사용을 하려하는데
여기서보면 현재 m_x 에 신택스 에러가 뜨고있다.
그 이유는 현재 m_x 는 클래스 내부에서 private 로 선언이 되어있는데
여기서 사용이 가능한게 friend 라는게 있다.
아 물론 Getm_x()으로 만들어둔 함수를 이용해도 된다!
friend 관련해서는 나중에 private, public 등등을 정리할 때
한번에 정리하겠다!
지금은 어떤용도로 사용하는지만 알아두자
class 내부에서
1 | friend ostream& operator<<(ostream& o, ComplexNumber& x); | cs |
를 적어주면
이 함수는 적어둔 클래스의 친구다! 라는걸 설명해주며 그안에서 해당 클래스의 private:: 형태의 data member 를 사용 가능해진다.
이제 이렇게 신택스에러가 사라지며 class 내부에 있는 print 함수를 지워줘도 되며
cout << c << endl; 이런식으로 사용이 가능해진다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <math.h> using namespace std; class ComplexNumber { double m_x; // 실수부분 저장 double m_y; // 허수부분 저장 public : ComplexNumber(); ComplexNumber(double x, double y) { m_x = x; m_y = y; } double real() { return m_x; } double imaginary() { return m_y; } double magnitude() { return sqrt(m_x*m_x + m_y*m_y); } double Getm_x() { return m_x; } double Getm_y() { return m_y; } ComplexNumber operator+(ComplexNumber &x) { return ComplexNumber(m_x + x.m_x, m_y + x.m_y); } ComplexNumber operator-(ComplexNumber &x) { return ComplexNumber(m_x - x.m_x, m_y - x.m_y); } ComplexNumber operator*(ComplexNumber &x) { //곱셈은 실수*실수-허수*허수 ( i의 제곱은 -1이다 ) //this.실수 * 실수 - this.허수 * 허수 //실수 부분 //+ this.실수 * 허수i + 실수 * this.허수i //허수부분 return ComplexNumber(m_x * x.m_x - m_y*m_y ,m_x*x.m_x + m_y*x.m_y); } //ComplexNumber operator*(ComplexNumber &x) { // double realPart = m_x * x.m_x - m_y*m_y ; // double imaginaryPart = m_x*x.m_x + m_y*x.m_y; // return ComplexNumber(realPart ,imaginaryPart); //} friend ostream& operator<<(ostream& o, ComplexNumber& x); }; ostream& operator<<(ostream& o, ComplexNumber& x) { o << "( " << x.m_x << ", " << x.m_y << " )" << endl; return o; } ComplexNumber::ComplexNumber() { m_x = 0; // 처음에는 기본적으로 사용하지 않는경우에는 m_y = 0; // 0이라는 값이 입력이 되어있는게 좋음 } int main() { ComplexNumber a(3.1,5.4); ComplexNumber b(1.6,1.3); ComplexNumber c; //양수 계산 c = a + b; cout << c << endl; //음수 계산 c = a - b; cout << c << endl; //실수부분 추출 double r = a.real(); cout << "실수 출력 :: " << r << endl; double i = a.imaginary(); cout << "허수 출력 :: " << i << endl; ComplexNumber e; //복소수의 곱셈 계산 e = a * b; cout << e << endl; } | cs |
'Dev > [C++]개념정리' 카테고리의 다른 글
[개탱][C++][상속][inheritance][수정필요] (0) | 2018.01.02 |
---|---|
[개탱][C++][shallow copy][deep copy] (0) | 2018.01.02 |
[개탱][C++][Operator Overloading][Operator][Overloading][복소수][complexNumber][1] (0) | 2018.01.02 |
[개탱][C++][static][static data member][class][static function] (0) | 2018.01.02 |
[개탱][C++][template][Generic class] (0) | 2018.01.02 |