Taene's

[C++] 복사 생성자 - 얕은 복사, 깊은 복사 본문

C++ 개념 공부

[C++] 복사 생성자 - 얕은 복사, 깊은 복사

taene_ 2024. 5. 13. 22:39

- 클래스를 이용해 사람1 객체를 만들고, 그 객체(사람1)의 쌍둥이를 표현하고자 사람2를 사람1의 객체 정보를 복사해오고 싶을 때 복사 생성자를 사용하면 된다.

 

- 복사 생성자 정의

#include <iostream>

class Person 
{
	int age;
	std::string name;
    
public:
	//기본 생성자
	Person() 
	{
		age = 30;
		name = "Codingsalad";
	}
	//입력 값이 있는 생성자
	Person(int _age, std::string _name) 
	{
		age = _age;
		name = _name;
	}
	//복사 생성자 정의
	Person(const Person& person) 
	{
		age = person.age;
		name = person.name;
	}
	void Print_data();
};

 

- 이때, 동적 할당되는 주소를 추가해보자.

#include <iostream>
#include <string>
#define _CRT_SECURE_NO_WARNINGS

class Person
{
	int age;
	std::string name;
	char* Address; // 주소를 추가

public:
	Person()
	{
		age = 30;
		name = "Codingsalad";
	}
	Person(int _age, std::string _name)
	{
		age = _age;
		name = _name;
		Address = nullptr;
	}
	Person(int _age, std::string _name, const char* _Address)
	{
		age = _age;
		name = _name;
		Address = new char[strlen(_Address) + 1];
		strcpy(Address, _Address);
	}
	//소멸자
	~Person()
	{
		//소멸자에서 Address 값이 삭제 됨.
		if (Address)
			delete[] Address;
	}

	void Print_data();
};

void Person::Print_data()
{
	std::cout << "AGE = " << age << " Name is " << name << std::endl;
}

int main()
{
	Person codingsalad = Person(25,"태연","과천시");
	Person copy_codingsalad = Person(codingsalad);

	codingsalad.Print_data();
	copy_codingsalad.Print_data();

	return 0;
}

//오류가 발생한다.
//이유는 codingsalad 객체의 Address 값과 copy_codingsalad 객체가 Address 값이 가리키는 값이 같은 주소를 가리키기 때문이다. 
//codingsalad의 소멸자가 실행되어 Address 값이 delete 됐는데, 
//copy_codingsalad의 소멸자가 이후에 실행되면서 같은 주소를 가리키고 있는(이미 삭제된) Adress 값을 delete 시도하므로 오류가 난다.
//기본 복사 생성자는 단순 복사이기 때문에 복사 생성자를 깊은 복사로 명시해 주면 된다.

 

- 깊은 복사 생성자를 이용한 객체 복사

#include <iostream>
#include <string>
#define _CRT_SECURE_NO_WARNINGS
class Person
{
	int age;
	std::string name;
	char* Address; // 주소를 추가

public:
	Person()
	{
		age = 30;
		name = "Codingsalad";
	}
	Person(int _age, std::string _name)
	{
		age = _age;
		name = _name;
		Address = nullptr;
	}
	Person(int _age, std::string _name, const char* _Address)
	{
		age = _age;
		name = _name;
		Address = new char[strlen(_Address) + 1];
		strcpy(Address, _Address);
	}
	//깊은 복사 생성자
	Person(const Person& person) 
	{
		age = person.age;
		name = person.name;
		// new 키워드를 사용하여 힙 영역에 동적 할당 
		Address = new char[strlen(person.Address) + 1];
		strcpy(Address, person.Address);
	}
	//소멸자
	~Person()
	{
		//소멸자에서 Address 값이 삭제 됨.
		if (Address)
			delete[] Address;
	}

	void Print_data();
};

void Person::Print_data()
{
	std::cout << "AGE = " << age << " Name is " << name << std::endl;
}

int main()
{
	Person codingsalad = Person(25,"태연","과천시");
	Person copy_codingsalad = Person(codingsalad);

	codingsalad.Print_data();
	copy_codingsalad.Print_data();

	return 0;
}

'C++ 개념 공부' 카테고리의 다른 글

[C++] 시간 복잡도  (0) 2024.09.11
[C++] 메모리 구조(코드, 데이터, 힙, 스택)  (1) 2024.04.19
[C++] 올림, 내림, 반올림  (0) 2023.09.07
[C++] Template  (0) 2023.09.05
[C++] ios_base::sync_with_stdio  (0) 2023.09.02