Hoon222y

[1220-4] 대입 연산자 오버로딩 / 비교 연산자 오버로딩 본문

코딩/교육

[1220-4] 대입 연산자 오버로딩 / 비교 연산자 오버로딩

hoon222y 2018. 12. 20. 20:50
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
//rule of 3
//1. 복사 생성자 2. 소멸자 3. 대입연산자
//대입 연산자 오버로딩
 
#include <iostream>
using namespace std;
 
class Person{
    char *name;
    int age;
public:
    Person() :name(0), age(0){}
    
    Person(const char * n, int a) : age(a){
        name = new char[strlen(n) + 1];
        strcpy(name, n);
    }
    
    //만약 클래스 내부에서 동적 할당된 자원이 있다면 반드시 아래의 3가지는 오버로딩 해야한다.
    //1. 소멸자
    ~Person() { delete[] name; }
    
    //2. 복사 연산자
    
    //3. 대입 연산자
    //만약 사용자가 대입 연산자를 추가하지 않는다면 컴파일러가 자동으로 추가하는데
    //이를 기본 대입 연산자 함수라고 한다. 모양은 아래와 같다.
    //Person& operator=(const Person& o){
    //  //얕은 복사 정책을 사용
    //  name = o.name;
    //  age = o.age;
    //}
    
    //아래의 코드는 자신을 대입했을 떄의 문제와 연산자를 연속적으로 사용할 때를 고려하지 않음.
    //수정 방안은?
    
    //대입 연산자가 연속적으로 사용될 수 있도록 자신을 반환해야 하는데 임시 객체가 아닌
    //자신으로 치환될려면 값이 아닌 참조로 반환해야 한다.
    Person operator=(const Person& o){
        //인자로 전달된 객체가 자기 자신인지 조사해야 한다.
        if (this != &o){
            //대입 연산자 함수를 깊은 복사 정책으로 변경
            cout << "operator(const Person&)" << endl;
            //기존에 데이터를 삭제한다.
            delete[] name;              //널 포인터를 삭제하는것은 안전하다. == free(0);
            name = new char[strlen(o.name) + 1];
            strcpy(name, o.name);
            age = o.age;
        }
        return *this;
    }
};
 
int main(){
    int a = 10;
    a = a;              //가능 자기자신을 복사하는 경우 / 근데 이걸 막아야 한다.
    
    int b = a = a;      //이럴경우 void 형이기때문에 대입이 안된다. 이러한 문제들이 발생
    
    Person p("hoon"10);
    Person q;
    
    Person x = q = p;   //이걸 해결하기 위해서 원래 void 형에서 Person& 으로 바꾸고 return *this
    //이거 하려면 복사 생성자 (2번항목)  해야된다 ㅠ..
    q = p;
    getchar();
}
 
cs



비교 연산자 오버로딩 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Int32{
    int val;
public:
    Int32(int v = 0) : val(v){}
    //비교 연산자를 오버로딩할 떄는 반드시 불린값을 반환해야 한다.
    bool operator==(const Int32& o){
        return val == o.val;
    }
    
};
int main(){
    Int32 i(10);
    Int32 j(20);
    if (i == j)                         //i.operator==(j)
        cout << "same" << endl;
    else
        cout << "not same" << endl;
}
cs


 비교 연산자에서 주의할 점은 오버로딩 할 때, return 값을 bool 타입을 해야한다는 점이다. 

Comments