본문 바로가기

C++/C++ 문법

[C++] 연산자 오버로딩을 활용한 객체의 대입

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
반응형