본문 바로가기
공부정리/c++

복사 생성자

by stdlib.h 2016. 7. 27.
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
class position
{
private:
    char *name;
    int age;
public:
    position(char *aname, int age)
    {
        position::name = aname;
        position::age = age;
 
    }
    ~position()
    {
        puts("파괴");
    }
};
 
int main(void)
{
    position a("갓코더"17);
    position b = a;
}
 
 
 
 
cs


설명은 거두절미하고, 위의 코드가 정상적으로 돌아갈 것 같은가?


분명 컴파일은 성공적일 것이다.


하지만, 종료되고 파괴자가 실행되면서 문제가 생긴다.


왜냐하면, a의 name이 가르키는 주소와 b의 name이 가르키는 주소가 같기 때문이다.


a의 파괴자가 생성되면서 name이 free되버리니, 다시 한번 b에서 파괴자를 다시 호출


하므로 오류가 생성된다.


때문에 정수끼리의 복사는 상관없다만, 포인터끼리라면 다르다.



그래서 이 값을 안전하게 복사해주는 생성자가 복사 생성자이다.


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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
class position
{
private:
    char *name;
    int age;
public:
    position(char *aname, int age)
    {
        position::name = aname;
        position::age = age;
 
    }
    position(position &other)
    {
        name = new char[strlen(other.name) + 1];
        strcpy(name, other.name);
        age = other.age;
    }
    ~position()
    {
        delete[] name;
    }
};
 
int main(void)
{
    position a("갓코더"17);
    position b = a;
}
 
 
 
 
 
cs


같은 클래스형 레퍼런스를 인자로 받아서, 새로 메모리를 할당해서


strcpy로 내용만 복사한다.


이러면 각 개체가 자신만의 공간을 가지므로 아까와 같은 오류가 안난다.


각 개체가 독립성을 가지게 하기 위해서 존재한다.



복사 생성자의 인수는 반드시 객체의 레퍼런스여야 한다.


왜냐하면, 복사 생성자도 함수이므로 실인수를 전달할 때 값의 복사가


발생할 것이다. 객체 자체를 인수로 전달하면 복사 생성자로 인수를 넘기는


과정에서 다시 복사생성자가 호출되고 또 다시 호출되며 무한 재귀 호출이


발생할것이다.


또한 객체가 아무리 거대해도 레퍼런스면 단 4바이트이므로 빠르다.

'공부정리 > c++' 카테고리의 다른 글

파괴자  (0) 2016.07.27
생성자  (0) 2016.07.27