A sentimental robot

복사생성자 본문

C++

복사생성자

GOD03219 2018. 9. 17. 14:36

복사생성자 호출시기

 

1. 객체 생성 시 객체를 인자로 줄 경우

2. 객체 생성 시 객체를 대입 할 경우

3. 메소드의 매개변수로 객체를 선언할 경우

4. 메소드에서 객체를 리턴할 경우

 

복사생성자는 객체가 생성되는 시점에서 데이터들이 몽땅 복사가 된다.

 

cf. 대입연산자함수는 객체가 생성된 이후에 ; 복사생성자와 시점이 다르다.

 

얉은 복사 : 필드를 포인터로 쓰지 않음

깊은 복사 : 개발자 몫

둘 다 목적은 field copy

 

- 얉은 복사

 

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
#include<iostream>
using namespace std;
 
class A {
    int a;
 
public:A(int a = 0) { this->= a; }
 
 
       A(A &t) 
       {
           this->= t.a;
       
       } // 디폴트 복사생성자의 모습..
 
       int getA()const {
           return a;
       }
 
};
 
void main() {
 
    A aa(90);
    cout << aa.getA() << endl// 90
 
    A bb(aa); // 복사생성자함수 호출하면 생성자 안 감
    cout << bb.getA() << endl// 90
 
 
 
}
 
cs

 

- 깊은 복사

디폴트 복사생성자를 사용했을 때

필드를 포인터로 썼을 경우에 문제가 생긴다 -> 주소를 복사해버리기 때문에

 

main이 끝나고 bb가 소멸할 때 a,b가 가르키는 주소를 delete 하고

aa 가 소멸할 때 이미 삭제 된 a,b를 delete 할 때 터짐

그래서 복사생성자 오버로딩해서 복사해옴 

 

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
#include<iostream>
using namespace std;
 
class A {
    int *a;
    int *b;
 
public:A(int a = 0)
{
    this->= new int;
    this->= new int;
 
    *(this->a) = a;
    *(this->b) = a;
}
 
       ~A() {
 
           delete a;
           delete b;
 
       }
 
       A(const A &t) // bb에서 aa클래스의 값을 변경하지 못하게 const
       {
           // *(t.a)=1000; // const를 하면 못하게 막을 수 있음
           this->= new int;
           this->= new int;
 
           *(this->a) = *(t.a);
           *(this->b) = *(t.b);
 
       }
 
       int getA()const {
           return *a;
       }
       int getB()const {
           return *b;
       }
};
 
void main() {
 
    A aa(90);
    cout << aa.getA() << aa.getB() << endl;
 
    A bb(aa);
    cout << bb.getA() << aa.getB() << endl;
 
 
 
}
 
cs

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

Has~A  (0) 2018.09.18
const  (0) 2018.09.17
C++ passing reference to pointer  (0) 2018.09.12
Namespace  (0) 2018.09.12
소멸자  (0) 2018.09.12