본문 바로가기
Programming/열혈 C++ 프로그래밍(저자 윤성우)

Ch 05. 복사 생성자(Copy Constructor)

by minjunkim.dev 2020. 8. 17.

    모든 내용은 [윤성우 저, "열혈 C++ 프로그래밍", 오렌지미디어] 를 기반으로 제 나름대로 이해하여 정리한 것입니다. 다소 부정확한 내용이 있을수도 있으니 이를 유념하고 봐주세요!


# C++ 스타일의 초기화

- 객체 생성의 예

int num=20;

(묵시적 변환, 자동변환)

int num(20);

- 위와 같은 묵시적 변환이 싫다면 생성자에 explicit 키워드를 사용하자.
그러면 더이상 대입연산자를 이용한 객체 생성 및 초기화는 불가능하다.


# 복사 생성자의 형태

클래스명(const 클래스명 &copy) // const 선언은 필수가 아니나, &는 필수임(안그러면 무한루프에 빠진다.)
:...(멤버 이니셜라이저를 통해 멤버대멤버 복사)
{
    ...(필요하다면 깊은 복사)
    ...(다른 것들도 수행가능)
}

# 복사 생성자는 호출되는 시점이 중요하다.
복사 생성자를 정의하지 않으면 디폴트 복사 생성자(멤버대멤버 복사가 진행되는 복사 생성자)가 삽입된다.

# 얕은 복사시에는 디폴트 복사 생성자만으로도 충분하기에
따로 복사 생성자를 정의할 필요가 없지만,
깊은 복사(멤버변수가 힙의 메모리 공간을 참조하는 경우)가 필요한 경우에는

반드시 따로 복사 생성자를 정의해야 한다.

# 복사 생성자가 호출되는 시점
1) 기존에 생성된 객체를 이용해 새로운 객체를 초기화하는 경우
2) Call-by-value 방식의 함수호출 과정에서 객체를 인자로 전달하는 경우
3) 객체를 반환하되, 참조형으로 반환하지 않는 경우
=> 결국 객체를 새로 생성하되, 생성과 동시에 동일한 자료형의 객체로 초기화해야 할 때이다.
=> 위 세경우 모두 메모리 공간이 할당되면서 동시에 초기화 되는 경우이다.
이 때, 초기화가 복사 생성자 호출을 통해 진행된다.

# 함수가 값을 반환한다는 것은?
1) 별도의 메모리 공간이 할당됨(임시객체(변수) 생성)
2) 이 공간에 반환값이 저장됨(반환값으로 초기화됨)


# 임시객체가 생성된 위치에는 임시객체의 참조값이 반환된다.
- 임시객체가 생성은 되지만, 이 객체는 메모리 공간에 존재하고, 이 객체의 참조값이 반환된다.
1) 임시객체는 다음 행으로 넘어가면 바로 소멸됨
2) 참조자에 의해 참조되는 임시객체는 바로 소멸하지 않음

# 클래스 외부에서 객체의 멤버변수(함수)를 호출하는 방법
1) 객체의 이름    e.g. obj.num
2) 객체의 참조값(객체 참조에 사용되는 정보)    e.g. objRef.num
3) 객체의 주소값    e.g. objPtr->num


[출처] : 윤성우 저, "열혈 C++ 프로그래밍", 오렌지미디어