본문 바로가기
OLD/[C++]개념정리

[개탱][C++][Operator Overloading][Operator][Overloading][복소수][complexNumber][2]

by 개탱 2018. 1. 2.
728x90

기본틀 

http://gaetaeng.tistory.com/33

[Operator Overloading][Operator][Overloading][복소수][complexNumber][1]





여기서 우리는 복소수 a, b, c의 값을 출력하기 위해서
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





댓글