: 한 객체가 다른 객체로 복사될 때 호출되는 특별한 멤버 함수
class MyClass {
public:
// 복사 생성자
MyClass(const MyClass& other) {
// 복사 수행
// ...
}
// 다른 멤버 함수들과 변수들
};
- 객체의 복사 생성자는 해당 객체와 동일한 자료형의 다른 객체를 받아들여서, 원본 객체의 내용을 새로 생성된 객체에 복사함
- 여기서 const MyClass& other는 복사 생성자의 매개변수로 전달되는 객체를 상수 참조로 받음을 나타냄
- 복사생성자가 호출될 때 복사될 객체를 변경하지 않고 읽기만 한다는 것을 의미
복사 생성자가 호출되는 상황
- 객체의 복사가 필요한 경우: 객체를 다른 객체로 복사하려고 할 때
- 함수에 인자로 전달
- 객체 반환
MyClass obj1;
MyClass obj2 = obj1; // 복사 생성자 호출
- 객체의 임시 복사: 임시 객체가 생성되어 반환되는 경우
MyClass createObject() {
MyClass tempObj;
return tempObj; // 복사 생성자 호출
}
복사 생성자는 기본적으로 컴파일러에 의해 자동으로 생성되지만, 클래스가 동적으로 할당된 자원을 소유하거나 복사 생성자의 동작을 사용자 정의해야 하는 경우, 사용자가 직접 복사 생성자를 구현할 수 있음
깊은 복사와 얕은 복사
얕은 복사
- 단순히 객체의 멤버 변수들을 복사하는 것을 의미
- 만약 객체가 동적으로 할당된 메모리를 포인터로 가지고 있다면, 얕은 복사는 그 포인터만을 복사하게 됨, 이는 두 객체가 같은 메모리를 공유하게 되는 결과를 가져옴
- 얕은 복사는 빠르게 이루어지지만, 두 객체 간의 독립성이 부족하며 하나의 객체가 자원을 변경하면 다른 객체도 영향을 받을 수 있음
class ShallowCopyExample {
public:
int *data;
// 얕은 복사 생성자
ShallowCopyExample(const ShallowCopyExample& other) : data(other.data) {}
};
깊은 복사
- 객체의 멤버 변수뿐만 아니라 그 멤버 변수가 가리키는 모든 자원까지 복사하는 것을 의미
- 동적으로 할당된 메모리가 있는 경우, 깊은 복사는 새로운 메모리를 할당하고 그 값을 복사하여 두 객체가 완전히 독립적으로 되도록 함
- 깊은 복사는 복사하는데 시간이 더 걸릴 수 있으며 메모리 소모가 더 많을 수 있음
class DeepCopyExample {
public:
int *data;
// 깊은 복사 생성자
DeepCopyExample(const DeepCopyExample& other) : data(new int(*(other.data))) {}
// 소멸자에서 동적으로 할당된 메모리 해제
~DeepCopyExample() {
delete data;
}
};
'Old > 복습' 카테고리의 다른 글
STL - sort (0) | 2024.01.18 |
---|---|
STL - max_element와 min_element (0) | 2024.01.18 |
C++ - 범위 기반 for문 (1) | 2024.01.03 |
C++ - 생성자와 소멸자 (0) | 2023.12.27 |
운영체제 - Call Stack (0) | 2023.12.27 |