#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=