본문 바로가기

Cpp

얕은 복사 깊은 복사

얕은 복사

값, 주소만 복사한다.

 

깊은 복사

복사 시 메모리를 새로 할당한 후 포인터가 가리키는 주소의 값을 넘겨준다.

 

 

모든 클래스는 디폴트 복사 생성자를 가지고 있다.

 


#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;
}

 

'Cpp' 카테고리의 다른 글

L-value, R-value  (0) 2023.06.19
스마트 포인터  (0) 2023.06.13
함수 포인터  (0) 2023.06.13
포인터  (0) 2023.06.12
STL MAP  (0) 2023.04.10