복사 생성자
1. 복사생성자
👉 객체의 복사본을 생서할 때 호출되는 생성자
이것도 생성자와 같이 디폴트 생성자처럼 생략이 가능
클래스 이름 (const 이름 &rValue);
상수형 참조이지만 Const도 생략 가능, 특별한 이유가 없다면 해주는 것이 코딩계 원칙
=> 복사를 했는데 원본이 손상되는 것을 막기 위해서
여기서 문제점
함수로 복사생성자를 호출하는 경우 성능에 안좋은 영향을 준다.
void TestFunc(CTestData param)
{
cout << "Test()" << endl;
param.SetData(20);
}
바로 이 경우이다!!!
쓸데없이 매개변수인 param은 호출자 원본을 두고 복사본이 생성되어 객체가 2개가 된다.
해결 방법!!!!!
1. 극단적으로 복사생성자를 없앤다.
=> 문법적 오류로 대신할 수 있음
이게 중요한 부분!!!
2. '참조자' 를 사용한다.
매개변수에 참조자 '&' 하나 넣은 것이 성능의 수준이 달라진다.
void TestFunc(CTestData ¶m)
{
cout << "Test()" << endl;
param.SetData(20);
}
하지만 더 깊게 들어가면 여기서도 문제가 보인다.
사용자가 이 함수를 사용할 때 참조자의 의한 형식인지 알 수 없어서 값이 변경될 수 있다는 점!!
그래서 여기도 const를 붙여주면 좋다.
void TestFunc(const CTestData ¶m)
{
cout << "Test()" << endl;
param.SetData(20);
}
2. 깊은 복사와 얕은 복사
👉 복사의 두 형태에 대해 알아보자
2 - 1 얕은 복사
👉 대상 값은 그대로 하나, 접근 포인터가 두 개
(책에서 이 부분을 삼각관계라 표현하여 코드로 삼각관계에 대해 설명하는데 흥미로운 설명이었다. 추천!)
int main()
{
int *pA, *pB;
pA = new int;
*pA = 10;
pB = new int;
pB = pA;
delete pA;
delete pB;
}
위와 같은 형태로 복사하는 것을 줄여서 얕복, 즉 얕은 복사라고 한다.
하지만 얕은 복사의 중요한 문제점이 있다.
바로 delete의 경우이다.
B는 A를 바라보고 있기 때문에 delete A를 하고 delete B를 하면
delete A로 지웠던 빈 내용을 delete B로 다시 지우라고 명령한게 되어버린다.
해결 방법!!!!!!
*pB = *pA;로 수정하면 된다.
아까는 아예 참조로 복사했지만 이번엔 pA의 값만 pB로 가져왔기 때문에
서로 다른 대상을 가리키게 된다.
2 - 2 깊은 복사
👉 실제로 두 개의 값이 생성
m_pData = new int;
*m_pData = *rhs.m_pData;
깊은 복사는 얕은 복사처럼 주소를 같은 값으로 만드는 것이 아닌
대상의 값을 가져와서 다시 포인터가 가리키는 메모리로 복사하는 것이다.

C++개념 바로잡기는 '이것이 C++이다' 책을 공부한 후 정리하며 쓴 클라이언트 개발 지망생의 공부 노트입니다.
'컴퓨터 언어 > C++' 카테고리의 다른 글
[C++이란?/4일차] C++ 개념 바로잡기 (0) | 2023.02.06 |
---|---|
[C++이란?/3일차] C++ 개념 바로잡기 (0) | 2023.01.30 |
[C++이란?/2일차] C++ 개념 바로잡기 (1) | 2023.01.27 |
[C++이란?/1일차] C++ 개념 바로잡기 (0) | 2023.01.25 |
[동계 캠프/3일차] AI Sarsa & Q_Learning (0) | 2023.01.11 |
댓글