728x90
반응형
복사 생성자를 활용한 객체의 대입
아래 코드처럼 복사 생성자를 활용하여 깊은 복사를 구현할 수도 있다.
class Bag {
private:
int* data;
size_t used;
size_t capacity;
public:
Bag(size_t capacity) {
data = new int[capacity];
this->capacity = capacity;
used = 0;
}
Bag(const Bag& source) // 복사 생성자를 활용한 깊은 복사
{
data = new int[source.capacity];
capacity = source.capacity;
used = source.used;
copy(source.data, source.used);
}
void copy(const int * arr, const size_t used)
{
for (size_t i = 0; i < used; i++)
this->data[i] = arr[i];
}
그런데 복사생성자를 사용하여 복사를 진행하면 객체를 초기화할 때 밖에 사용할 수 없다.
따라서 언제든 대입을 할 수 있는 코드를 구현하기 위해서는 연산자 오버로딩을 활용해야 한다.
연산자 오버로딩을 활용한 객체의 대입
아래코드는 연산자 오버로딩을 활용하여 객체의 대입을 구현했다.
Bag operator=(const Bag& source)
{
if (this == &source)
return *this;
if (capacity != source.capacity)
{
delete[] data;
data = new int[source.capacity];
capacity = source.capacity;
}
used = source.used;
copy(source.data, source.used);
return *this;
}
연산자 오버로딩을 활용하여 객체의 대입을 구현할 때에는 객체에 이미 데이터가 들어있을 수 있기 때문에 데이터를 비우고 대입을 진행해주어야 한다.
따라서 아래 코드처럼 사용하는 것이 가능하다.
#include <iostream>
using namespace std;
class Bag {
private:
int* data;
size_t used;
size_t capacity;
public:
Bag(size_t capacity) {
data = new int[capacity];
this->capacity = capacity;
used = 0;
}
Bag operator=(const Bag& source)
{
if (this == &source)
return *this;
if (capacity != source.capacity)
{
delete[] data;
data = new int[source.capacity];
capacity = source.capacity;
}
used = source.used;
copy(source.data, source.used);
return *this;
}
void copy(const int * arr, const size_t used)
{
for (size_t i = 0; i < used; i++)
this->data[i] = arr[i];
}
void GetBagData()
{
cout << "Data : ";
for (size_t i = 0; i < used; i++)
cout << data[i] << " ";
cout << endl;
cout << "used : " << used << endl;
cout << "capacity : " << capacity << endl;
}
void GetData(int i)
{
for (int j = 0; j < i; j++) {
cin >> data[j];
used++;
}
}
};
int main()
{
Bag a(10);
a.GetData(5);
a.GetBagData();
cout << endl;
Bag b(3);
b = a;
b.GetBagData();
Bag c(15);
c.operator=(a);
c.GetBagData();
return 0;
}
728x90
반응형
'C++ > C++ 문법' 카테고리의 다른 글
[C++] 단항 연산자 오버로딩 (전위, 후위 연산자 오버로딩) (0) | 2024.09.26 |
---|---|
[C++] friend, friend 함수 (0) | 2024.09.26 |
[C++] 연산자 오버로딩 (멤버함수와 전역함수에 의한 연산자 오버로딩) (0) | 2024.09.24 |
[C++] 객체 내에서 static 변수, static 멤버함수 (0) | 2024.05.03 |
[C++] 얕은 복사, 깊은 복사 (0) | 2024.05.02 |