Programming/C/C++2013. 2. 27. 21:21

복사 생성자

 

객체를 인자로 받을 수 있는 생성자를 복사 생성자라고 한다.

 

- const를 붙여 내용 변경 방지
- 복사 생성자는 &를 반드시 해줄것.

 

 

 

ex) 복사 생성자의 정의가 필요한 경우

 

class Test{

private:

char *mystr;

public:

Test(char *pstr)

{

mystr = new char[strlen(pstr)+1];

strcpy(mystr, pstr);

}

~Test()

{

delete []mystr;

}

};

 

int main()

{

Test myobj("Hello ~~");

Test myobj2 = myobj; //또는 Test myobj2(myobj)의 경우

}

 

멤버 변수 mystr이 가지는 주소값만 복사될 뿐 실제 "Hello ~~"라는 문자열은 하나 밖에 없으므로 소멸에서 2번이나 delete하게 된다.

따라서 아래와 같이 복사 생성자를 정의해주면 문제가 해결된다.

 

Test(const Test& copy)

{

mystr = new char[strlen(copy.mystr)+1];

strcpy(mystr, copy.mystr);

}

 

 

[*] 복사 생성자 Test앞에 explicit 키워드를 붙여주면 위의 소스를 참고 했을 때 아래처럼 된다.

 

Test myobj2 = myobj; <--  불가능

Test myobj2(myobj) <--  가능

 

 

 

[ 복사 생성자가 호출되는 시점 ]

 

복사 생성자가 호출되는 시점은 객체가 새로 생성되는 시점이다.

 

1) 기존의 객체로 새로운 객체를 초기화하는 경우

2) Call by value로 객체를 인자로 전달하는 경우

3) 객체를 반환하되, 참조형이 아닌 경우

(함수가 값을 반환하면 별도의 메모리 공간이 할당되고, 이 공간에 반환 값이 저장된다. - 임시 객체)

 

 

 

 

 

 

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

C++ 상속시의 접근제어 지시자  (0) 2013.03.09
C++ 상속시 생성자, 소멸자의 호출  (0) 2013.03.09
복사 생성자  (0) 2013.02.27
C++ 기초 [3]  (0) 2013.02.27
C++ 기초 [2]  (0) 2013.02.26
C++ 기초 [1]  (0) 2013.02.26
Posted by bbolmin

댓글을 달아 주세요