Programming/C C++
같은 클래스의 객체간 다음과 같은 구현을 하는 경우
Base b;

Base b2;
b2 = b;

//또는

Base b2(b);

원본객체가 갖고 있던 모든 멤버의 값을 대상 객체에 그대로 복사해 넣게 됩니다.

그런데 멤버중 주소값을 갖는 포인터가 있는 경우에는 포인터가 지시하고 있는 메모리의 데이터를 복사하는 것이 아니라 메모리의 주소값만을 복사하게 됩니다. 이렇게 되면 원본이나 복사본 객체에서 해당 메모리를 해제하거나 값을 변경하는 경우 다른 객체에도 똑같이 영향을 받게 되는 것이죠.

이러현 동작을 원하지 않는 경우에는 복사생성자를 직접 작성하여 포인터가 가진 메모리안의 값을 직접 복사해 오도록 구현해야 합니다.

class Base
{
public:
   int* value;
   Base(const Base& b);
   Base::Base();
   Base::~Base();
};

Base::Base(const Base& b)
{
   value = new int;
   *value = *(b.value);
}

Base::Base()
{
   value = new int;
}

Base::~Base()
{
   delete value;
}
Base에 복사생성자(const Base& b)를 직접 작성하여 매개변수로 넘어온 객체가 가진 value값을 가져오도록 하였습니다.
Base b;
*(b.value) = 30;

Base b2(b);
*(b2.value) = 50;

cout << *(b.value) << endl;
cout << *(b2.value) << endl;
Base에 대한 원본객체를 생성하고 value에 값을 할당한뒤 b2라는 또 다른 객체를 만들어 b의 멤버값을 복사하도록 하였습니다.

이때 value라는 포인터는 위에서 만든 복사생성자에 의해 주소가 아닌 값이 복사되도록 하였으므로 b와 b2가 가진 value값은 다르게 출력될 것입니다.

'Programming > C C++' 카테고리의 다른 글

[Visual C++] 프렌드 클래스  (0) 2012.10.16
[Visual C++] 배열  (3) 2012.10.10
[Visual C++] 복사생성자  (0) 2012.10.09
[Visual C++] 클래스(Class) 의 기본  (5) 2012.10.08
[Visual C++] 연산자 오버로딩(Operator Overloading)  (0) 2012.10.05
[Visual C++] 포인터와 참조  (2) 2012.07.12
0 0