CS/C++

얕은복사 / 깊은복사

혀니리리 2023. 12. 14. 11:57
728x90

* 얕은복사: 의존적인 복사

#include<iostream>
using namespace std;

class MyArray {
public:
	int size;
	int* data;

	MyArray(int size)
	{
		this->size = size;
		data = new int[size];
	}

	MyArray(const MyArray& other);

};

MyArray::MyArray(const MyArray& other) {
	this->size = other.size;
	this->data = other.data;
}



int main() {

	MyArray buffer(10);
	buffer.data[0] = 2;

	MyArray clone = buffer;
	buffer.data[0] = 3;

	cout << "clone.data[0] = " << clone.data[0] << endl;

	return 0;
}

복사한 대상자가 바뀌면 복사한 객체도 같이 변하게 됨

 

*깊은복사: 객체가 가진 모든 멤버를 복사

새로이 동적할당을 받고, 원본의 데이터를 복사함

#include<iostream>
using namespace std;

class MyArray {
public:
	int size;
	int* data;

	MyArray(int size){
		this->size = size;
		data = new int[size];
	}
	//원래 있던 것을 지움.
	~MyArray() {
		if (this->data == NULL) {
			delete[]data;
		}
	}
	
    
	MyArray(const MyArray& other) {
		//모든걸 복사한 후 새로운 객체 생성
		this->size = other.size;
		this->data = new int[size];

		for (int i{ 0 }; i < other.size; i++) {
			this->data[i] = other.data[i];
		}
	}
};

int main() {

	MyArray buffer(10);
	buffer.data[0] = 2;

	MyArray clone = buffer;
	buffer.data[0] = 3;

	cout << "clone.data[0] = " << clone.data[0] << endl;




	return 0;
}

-> 복사한 대상자가 바껴도 복사된 객체는 아무런 영향을 받지 않음

728x90

'CS > C++' 카테고리의 다른 글

이동 의미론 ( move semantics)  (0) 2023.12.14
L value 와 R value  (0) 2023.12.14
c++ typedef vs using 키워드 차이점  (0) 2023.12.14
C++ template 장단점  (0) 2023.12.14
c++ 캐스팅  (0) 2023.12.14