Taene's
[C++] 복사 생성자 - 얕은 복사, 깊은 복사 본문
- 클래스를 이용해 사람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 |