본문 바로가기

Archived(CSE Programming)/cpp

Chap 5. 복사 생성자(Copy Constructor)

Chap 5. 복사 생성자(Copy Constructor)


5-1. 복사 생성자와의 첫 만남


우리는 기존의 c 스타일에서 초기화를 할 때,

int num = 20; int & ref = num; 을 사용했다면


c++ 에서는 다음과 같은 초기화가 가능하다.

int num(20); int & ref(num); 


즉, 마찬가지로 대입연산에서도 이러한 의미를 지니게 되는 것이다.


1
2
Object obj1(40);
Object obj2 = obj1; // Object obj2(obj1)
cs


이러한 초기화의 의미는 결국 생성자로 객체를 인자로 받았을 때 어떻게 처리할 지를 우리 c++ 프로그래머가 지정할 수 있는 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Class Ex{
private:
    int num1;
    int num2;
public:
    // 생성자
    Ex(const int & n1, const int & n2):num1(n1), num2(n2){
        ;
    }
    // 복사 생성자
    Ex(const Ex & copy):num1(copy.num1), num2(copy.num2){
        ;
    }
    ...
 
};
 
cs


다음과 같이 복사 생성자를 우리가 원하는 형태로 커스터마이징 할 수 있게 되어 대입 연산에 대해서 원하는 형태로 처리가 가능한 것이다.

물론 아무것도 지정하지 않아도 Default 복사 생성자로 멤버 대 멤버로 대입하는 복사 생성자가 들어간다.

그리고 이러한 형변환이 이루어지지 않도록 설정하려면 복사 생성자 앞에 explicit 키워드를 삽입하면 된다.


5-2. 깊은 복사와 얕은 복사


깊은 복사는 말 그대로, 모든 내부를 그대로 복사하는 복사이고 얕은 복사는 얕은 의미의 복사를 말하는 것이다.

객체의 멤버 변수로 동적할당이 이루어진 변수가 있다면 깊은 복사는 새로운 동적 할당이 이루어지는 것을 말하는 것이고

얕은 복사는 같은 메모리를 가르키는 복사를 말한다.


5-3. 복사 생성자의 호출 시점


Case 1. 기존에 생성된 객체를 이용해서 새로운 객체를 초기화하는 경우(앞 선 경우)
Case 2. Call-by-value로 객체인자를 통해 함수를 호출할 경우.

Case 3. 객체를 반환하되 참조형으로 반환하지 않는 경우. 


1
2
3
4
5
6
7
8
Case 1.
Object obj1 = obj2; // Object obj1(obj2)
 
Case 2. 
void func(Object obj1); // obj1을 매개 변수로 사용할 경우 함수 호출 시 복사 생성자 호출
 
Case 3.
Object func(void// 메모리 공간에 임시객체로 Obeject 반환형을 저장해야 하므로 복사 생성자 
cs


'Archived(CSE Programming) > cpp' 카테고리의 다른 글

Chap 7. 상속(Inheritance)의 이해  (0) 2019.01.08
Chap 6. friend와 static 그리고 const  (0) 2019.01.07
Chap 4. 클래스의 완성  (0) 2019.01.05
Chap 3. 클래스의 기본  (0) 2019.01.04
Chap 2. C언어 기반의 C++ 2  (0) 2019.01.04