복사 생성자
얕은 복사와 깊은 복사
새롭게 생성하는 변수에 다른 변수의 값을 대입하기 위해서는 대입 연산자(=)를 사용하면 됩니다.
예제
int x = 10;
int y = x;
마찬가지로 새롭게 생성하는 객체에 또 다른 객체의 값을 대입하기 위해서도 대입 연산자(=)를 사용할 수 있습니다.
예제
Book web_book("HTML과 CSS", 350);
Book html_book = web_book;
하지만 대입 연산자를 이용한 객체의 대입은 얕은 복사(shallow copy)로 수행됩니다.
얕은 복사(shallow copy)란 값을 복사하는 것이 아닌, 값을 가리키는 포인터를 복사하는 것입니다.
따라서 변수의 생성에서 대입 연산자를 이용한 값의 복사는 문제가 되지 않지만, 객체에서는 문제가 발생할 수도 있습니다.
특히 객체의 멤버가 메모리 공간의 힙(heap) 영역을 참조할 경우에는 문제가 발생합니다.
복사 생성자(copy constructor)
C++에서 복사 생성자란 자신과 같은 클래스 타입의 다른 객체에 대한 참조(reference)를 인수로 전달받아, 그 참조를 가지고 자신을 초기화하는 방법입니다.
복사 생성자는 새롭게 생성되는 객체가 원본 객체와 같으면서도, 완전한 독립성을 가지게 해줍니다.
왜냐하면, 복사 생성자를 이용한 대입은 깊은 복사(deep copy)를 통한 값의 복사이기 때문입니다.
Book 클래스의 복사 생성자의 원형은 다음과 같습니다.
예제
Book(const Book&);
복사 생성자는 다음과 같은 상황에서 주로 사용됩니다.
1. 객체가 함수에 인수로 전달될 때
2. 함수가 객체를 반환값으로 반환할 때
3. 새로운 객체를 같은 클래스 타입의 기존 객체와 똑같이 초기화할 때
예제
Book::Book(const Book& origin) // 복사 생성자의 선언
{
title_ = origin.title_;
total_page_ = origin.total_page_;
current_page_ = origin.current_page_;
percent_ = origin.percent_;
}
int main(void)
{
Book web_book("HTML과 CSS", 350);
Book html_book(web_book);
...
}
실행 결과
첫 번째 책의 제목은 HTML과 CSS이고, 총 페이지는 350장입니다.
두 번째 책의 제목은 HTML과 CSS이고, 총 페이지는 350장입니다.
위의 예제는 복사 생성자를 이용해 새롭게 생성되는 html_book 객체를 같은 클래스의 web_book 객체로 초기화하고 있습니다.
위의 예제에서 Book html_book(web_book); 구문은 컴파일러에 의해 다음과 같이 복사 생성자를 사용한 것으로 해석됩니다.
예제
Book html_book = Book(web_book);