반응형

operator을 배우기 전 예를 들어보자.


struct myStruct {

int a, b;

};

가 있고


int main() {

myStruct s1, s2;

s1.a = 1;

s1.b = 2;


s2.a = 10;

s2.b = 20;


myStruct s3 = s1 + s2;


return 0;

}

라는 코드는 성립할까 과연 ?


s3 = s1 + s2라는 곳에서 빨간줄이 뜨게 될 것인데


이 이유는 우리는 눈으로 봤을때 s1의 a와 s2의 a가 서로 더해지고, s1의 b가 s2의 b가 서로 더해지면 된다고 생각할 것이다.


하지만 컴퓨터는 그렇게 인식하지 못하게 되고 '무슨말을 하는거지?'라고 생각하게 된다.


따라서 우리는 myStruct에서 '+'가 무엇을 의미하는지 컴퓨터에게 알려주어야 한다.


즉, '+'는 우리가 생각하듯이 s1의 a와 s2의 a를 더하고 s1의 b와 s2의 b가 더해진다고 알려주어야 한다.


따라서 우리는 struct 내에 +가 무엇을 의미하는지 설명해야 한다.


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
#include <iostream>
 
using namespace std;
 
struct myStruct {
    int a, b;
 
    myStruct operator +(myStruct v){
        myStruct t;
        t.a = a + v.a;
        t.b = b + v.b;
        return t;
    }
};
int main() {
    myStruct s1, s2;
    s1.a = 1;
    s1.b = 2;
    
    s2.a = 10;
    s2.b = 20;
    
    myStruct s3 = s1 + s2; // myStruct s3 = s1.operator+(s2);
    
    cout << s3.a << " " << s3.b << endl;
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
cs


위와 같이 operator +를 선언해보자.


위의 코드의 의미는 다음과 같다.


myStruct t를 하나 생성하고 t라는 구조체에 매개변수인 v에 있는 v.a, v.b를 각각 현재 struct의 a, b에 더한다.


이때 현재 struct의 의미는 s1 + s2에서 s1을 의미하게 된다.


즉, s1 + s2는 사실상 s1에 있는 +함수를 쓰는것과 같다.


따라서 s1 + s2를 s1.operator+(s2)라고 해도 동일하다.


그 후 t를 반환해주면 s3 구조체는 t의 구조체 정보를 그대로 받게 된다.


이렇게 '+' operator을 구성 할 수 있다.



그렇다면 이제 -, *, /를 구현해보고 +=, -=, ==도 구현해보자(자신의 입맛대로 짜기 나름이다. 정해진 방법은 없다.)


+=에 대한 예제 코드만 아래에 작성해보고자 한다.


위의 코드를 이용한다면 쉽게 구현 할 수 있다.


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
#include <iostream>
 
using namespace std;
 
struct myStruct {
    int a, b;
 
    myStruct operator +(myStruct v) {
        myStruct t;
        t.a = a + v.a;
        t.b = b + v.b;
        return t;
    }
 
    void operator +=(int v1) {
        a += v1;
        b += v1;
    }
};
int main() {
    myStruct s1, s2;
    s1.a = 1;
    s1.b = 2;
 
    s2.a = 10;
    s2.b = 20;
 
    myStruct s3 = s1 + s2;
    s3 += 100;
    cout << s3.a << " " << s3.b << endl;
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus




추가


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
#include <iostream>
#include <cstdio>
 
using namespace std;
 
class myClass {
private:
    int x, y;
 
public:
    // myClass(int tx = 0, int ty = 0):x(tx), y(ty){}
    myClass(int tx = 0int ty = 0) {
        x = tx;
        y = ty;
    }
 
    ~myClass() {}
 
    myClass operator +(myClass v) {
        myClass tmp;
        tmp.x = x + v.x;
        tmp.y = y + v.y;
 
        return tmp;
    }
 
    void operator +=(int value){
        x += value;
        y += value;
    }
 
    bool operator >=(myClass v) {
        // 둘다 같은 경우
        if (x == v.x && y == v.y)
            return true;
 
        // x가 같은 경우
        else if (x == v.x)
            return y >= v.y;
 
        /*
        else if (x == v.x)
        {
            if (y >= v.y)
                return true;
            return false;
        }*/
    }
 
    friend ostream &operator<<(ostream &const myClass &p);
};
 
ostream &operator<<(ostream &os, const myClass &p)
{
    os << "x값 :: " << p.x << " y값 :: " << p.y;
    return os;
}
 
int main()
{
    myClass a(1,2), b(100200);
    
    cout << a << endl;
    a += 1000;
 
    cout << a << endl;
 
    a = a + b; // a.operator+(b)
    cout << a << endl;
 
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus










반응형

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

다양한 입/출력 방식  (0) 2018.03.07
참조, template  (0) 2018.03.02
class 및 상속  (0) 2018.02.27
입출력, namespace  (0) 2018.02.26