복사 생성자란?
- 멤버 대 멤버 복사를 실행한다.
- 복사 생성자를 정의하지 않으면 멤버 대 멤버의 복사를 진행하는 디폴트 복사 생성자가 자동으로 삽입된다.
class Point
{
private:
int x;
int y;
public:
Point(int x, int y) : x(x), y(y) { } // 디폴트 생성자
Point(const Point ©) : x(copy.x), y(copy.y){ } // 디폴트 복사 생성자
};
깊은 복사와 얕은 복사
얕은 복사
- 멤버변수의 멤버 대 멤버 복사만 실행한다.
Person man1("Kang", 29); Person man2 = man1;
깊은 복사
- 메모리 공간 할당 후 문자열 복사
- 할당된 메모리의 주소 값을 멤버에 저장한다.
Person(const Person& copy) : age(copy.age) { name = new char[strlen(copy.name)+1]; strcpy(name, copy.name); }
- 멤버변수
age
의 멤버 대 멤버 복사 - 메모리 공간 할당 후 문자열 복사, 그리고 할당된 메모리의 주소 값을 멤버
name
에 저장
복사 생성자의 호출시점
1. 기존에 생성된 객체를 이용해 새로운 객체를 초기화하는 경우
- 가장 일반적인 경우이다.
Person man1("Kang", 27);
Person man2 = man1; // 복사 생성자 호출
2. Call-by-value 방식의 함수호출 과정에서 객체를 인자로 전달하는 경우
SoSimple sim1(SoSimple ob) {}
SoSimple sim2;
sim1(sim2); // SoSimple sim1 = sim2;로 복사 생성자가 호출된다.
3. 객체를 반환하되, 참조형으로 반환하지 않는 경우
- 반환하는 순간
SoSimple
객체를 위한 메모리 공간 할당 후 임시객체의 복사 생성자가 호출된다.
SoSimple func(SoSimple ob)
{
return ob;
}
복사 생성자 호출 시점 정리
- 객체를 새로 생성해야 한다. 생성과 동시에 동일한 자료형의 객체로 초기화해야 한다.
- 임시객체는 다음 행으로 넘어가면 바로 소멸되어 버린다.
- 참조자에 참조되는 임시객체는 바로 소멸되지 않는다.
'Programming | 프로그래밍 언어 > C++' 카테고리의 다른 글
Dangling Pointer (0) | 2022.11.19 |
---|---|
C++ STL 벡터, 리스트, 덱 비교 (0) | 2022.11.18 |
생성자, 소멸자, 이니셜라이저, this (0) | 2022.11.11 |
캡슐화와 const 함수 (0) | 2022.11.10 |
구조체, 클래스, 접근제어지시자 (0) | 2022.11.10 |