[c++] vector 대입 연산자를 이용한 깊은 복사

숭글·2023년 1월 6일
0
#include <vector>

class NumVec{
	public : 
		NumVec(){};
		NumVec(int n): _maxAmount(static_cast<std::vector<int>::size_type>(n)){};
        NumVec(NumVec &obj); // 아래 구현
		~NumVec(){};
		void addNumber(int num); // 아래 구현
		int getNumber(int idx){ return (_spots[idx]);};
		void setNumber(int idx, int num){_spots[idx] = num;};

	private :
		std::vector<int>		_vec;
		std::vector<int>::size_type	_maxAmount;

};

NumVec::NumVec(NumVec &obj){
	_maxAmount = obj._maxAmount;
	_spots = obj._spots;
}

void NumVec::addNumber(int num){
	if (_spots.size() >= _maxAmount)
		throw std::exception();
	_spots.push_back(num);
}

_maxAmount만큼 벡터에 값을 저장하는 NumVec 클래스이다.
vector타입의 _vec 멤버변수를 갖고있다.

#include "NumVec.hpp"
#include <iostream>

int main(){
	NumVec a(10);

	a.addNumber(1);
	a.addNumber(2);

	NumVec b(a);
	std::cout << "before copying b[0]: " << b.getNumber(0) << std::endl;

	b.setNumber(0, 32);
	std::cout << "after copying a[0]: " << a.getNumber(0) << std::endl;
	std::cout << "after copying b[0]: " << b.getNumber(0) << std::endl;
}

복사 생성자를 이용해 a를 복사한 b객체를 생성한 후,
b의 멤버 함수 setNumber()이용하여 b의 _vec의 원소의 값을 수정했다.

NumVec의 복사 생성자 내에서는 값을 대입만 할 뿐 깊은 복사를 하기 위한 코드가 작성돼있진 않다.

output >

before copying b[0]: 1
after copying a[0]: 1
after copying b[0]: 32

a와 b의 벡터 인덱스 0의 값을 출력했다.
출력 결과처럼 b의 멤버 변수의 값이 변경되어도 a의 멤버 변수의 값은 변경되지않았다.

vector가 오버로딩해둔 대입 연산자를 사용하면 깊은 복사가 보장된다는 것을 알 수 있다.

아래에 더 이해하기 쉬운 예제가 있다!!!
std::vector::operator=

profile
Hi!😁 I'm Soongle. Welcome to my Velog!!!

0개의 댓글