얕은 복사
값, 주소만 복사한다.
깊은 복사
복사 시 메모리를 새로 할당한 후 포인터가 가리키는 주소의 값을 넘겨준다.
모든 클래스는 디폴트 복사 생성자를 가지고 있다.
#include<iostream>
#include<string>
#include<vector>
#include<sstream>
using namespace std;
class A
{
public:
int* numP = nullptr;
int num = 5;
// 얕은 복사
/*A(const A& a)
{
this->numP = a.numP;
this->num = a.num;
}*/
A(int& c)
{
numP = &c;
}
// 깊은 복사
A(const A& a)
{
this->num = a.num;
// 매개변수 a의 numP가 널값이 아닐 때
if (a.numP != nullptr)
{
this->numP = new int[sizeof(a.numP)];
*this->numP = *a.numP;
}
else
{
this->numP = nullptr;
}
}
// 깊은 복사를 위한 대입 연산자 오버로딩
A& operator=(const A& a)
{
if (this == &a)
{
return *this;
}
// 매개변수 a의 numP가 널값이 아닐 때
if (a.numP != nullptr)
{
this->numP = new int[sizeof(a.numP)];
*this->numP = *a.numP;
}
else
{
this->numP = nullptr;
}
}
};
int main(void)
{
int c = 3;
int d = 4;
A a(c);
cout << a.num << endl; // 5
cout << *a.numP << endl; // 3
cout << endl;
// 복사 생성자로 깊은 복사
A b = a;
a.numP = &d;
cout << a.numP << endl; // 00F5FCE8
cout << *a.numP << endl; // 4
cout << b.numP << endl; // 01354AD8 깊은 복사로 인해 주소가 다르다.
cout << *b.numP << endl; // 3 // 깊은 복사로 인해 값이 4로 바뀌지 않는다.
cout << endl;
// 대입 연산자 오버로딩으로 깊은 복사
b = a;
cout << a.numP << endl; // 00F5FCE8
cout << *a.numP << endl; // 4
cout << b.numP << endl; // 01353C20 // 연산자 오버로딩으로 깊은 복사하여 주소 값이 바뀌었다.
cout << *b.numP << endl; // 4
return 0;
}