본문 바로가기

코드^학습/메모한 지식

C++ 복사 생성자에 대해

C++에서 다루는 class는 생성자, 소멸자를 동반하는 것이 필수입니다(정의 안 해줘도 디폴트 생성자, 디폴트 소멸자를 컴파일러가 추가해주지만)


이중 복사 생성자는 동일한 class로 만들어진 객체 A와 객체 B가 있다면 B = A 혹은 B(A)를 말합니다.


AAA object1(7);

AAA object2(object1); // 혹은 AAA object2 = object1;


복사 생성자 역시 사용자가 정의하지 않으면 컴파일러가 이를 체크하여 디폴트 복사 생성자를 추가합니다.


여기에서 얕은 복사와 깊은 복사가 존재하는데

이를 구분하는 기준은 멤버변수가 Heap영역을 사용하느냐 안 하느냐입니다.


BBB object3("string in heap");

BBB object4(object3);


위와 같이 멤버변수를 초기화 해줄 때, 문자열과 같은 Heap관계 영역을 사용한다면 문자열 자체를 복사하는 것이 아니라

이미 있는 문자열을 두 객체가 같이 참조하고 있는 형태가 됩니다.

즉, 문자열 자체를 복사한 것이 아니라 포인터 값을 복사한 것뿐이기에 얕은 복사라고 부를 수 있습니다.

(디폴트 생성자는 얕은 복사를 수행합니다.)


이 문제를 해결할려면 하나의 메모리를 두개의 포인터가 참조하지 않고 하나의 포인터가 하나의 메모리를 참조하게 만들면 됩니다.


//BBB 클래스의 복사 생성자를 다음과 같이 바꿔봅시다.

BBB(const BBB& object)

{

str = new char[strlen(object.str) + 1]; //null문자를 고려하여 +1

strcpy(str, object.str);

}




참조 : http://mooneegee.blogspot.kr/2015/02/c-copy-constructor.html / 윤성우 저, 열혈강의 C++ 프로그래밍