본 글은 공부용으로 작성된 게시글입니다.
복사에는 얕은 복사와 깊은 복사가 있다.
얕은 복사(shallow copy)란 값을 복사하는 것이 아닌, 값을 가리키는 포인터를 복사하는 것으로
변수의 생성에서 대입 연산자를 이용한 값의 복사는 문제가 되지 않지만, 객체에서는 문제가 발생할 수도 있습니다.
특히 객체의 멤버가 메모리 공간의 힙(heap) 영역을 참조할 경우에는 문제가 발생한다고한다고한다고한다고한다....
복사 생성자(copy constructor)
C++에서 복사 생성자란 자신과 같은 클래스 타입의 다른 객체에 대한 참조(reference)를 인수로 전달받아, 그 참조를 가지고 자신을 초기화하는 방법.
쉽게 말하자면 복사되는 대상과 동일한 객체를 하나 더 생성한다고 볼 수 있다. (이는 깊은 복사 방법이다.)
따라서 복사 생성자는 새롭게 생성되는 객체가 원본 객체와 같으면서도, 완전한 독립성을 가지게 해준다고도 볼 수 있다.
복사 생성자를 이용한 대입은 위에서 말한대로 깊은 복사(deep copy)를 통한 값의 복사이기 때문이다.
복사 생성자는 다음과 같은 상황에서 주로 사용된다.
1. 객체가 함수에 인수로 전달될 때
2. 함수가 객체를 반환값으로 반환할 때
3. 새로운 객체를 같은 클래스 타입의 기존 객체와 똑같이 초기화할 때
작성 방법
복사생성자는 아래와 같이 작성되어야한다.
class Test {
public:
Test(const Test& obj) {
...
}
}
매개변수를 레퍼런스 타입으로 선언하는 이유는 객체의 경우 일반적으로 차지하는 메모리가 큰데, Call by Value 타입으로 매개변수를 넘겨주게된다면 매개 변수를 새로운 객체에 복사하는 작업을 수행하게 되기 때문에 이는 상당히 비효율적이기 때문이다.
그 다음으로, 매개변수를 const 타입으로 선언한 이유는 "복사할 객체"는 생성자 내에서 값을 변경할 일이 전혀 없기때문이다.
복사생성자의 특징
1. 자신과 같은 타입의 객체를 인자로 받는다.
2. 복사 생성자가 정의되어 있지 않다면, 디폴트 복사 생성자(Default Copy Constructor)가 생성된다.
이때, 디폴트 복사 생성자는 "얕은 복사(Shallow copy)"를 수행한다.
참조 http://www.tcpschool.com/cpp/cpp_conDestructor_copyConstructor
참조 https://velog.io/@sjongyuuu/C-%EB%B3%B5%EC%82%AC-%EC%83%9D%EC%84%B1%EC%9E%90Copy-Constructor
'프로그래밍 > C++' 카테고리의 다른 글
함수포인터 (0) | 2022.08.25 |
---|---|
Lvalue Rvalue (0) | 2022.08.23 |
가상함수테이블 (0) | 2022.08.22 |
가상함수 및 재정의 (0) | 2022.08.19 |
생성자와 소멸자 (0) | 2022.08.18 |
댓글