[C/C언어/VC++/C프로그래밍]복사생성자[01 깊은 복사]

C/C언어/VC++/C프로그래밍 C/C언어/VC++/C프로그래밍C/C언어/VC++/C프로그래밍 C/C언어/VC++/C프로그래밍C/C언어/VC++/C프로그래밍 C/C언어/VC++/C프로그래밍C/C언어/VC++/C프로그래밍 C/C언어/VC++/C프로그래밍C/C언어/VC++/C프로그래밍 C/C언어/VC++/C프로그래밍C/C언어/VC++/C프로그래밍 C/C언어/VC++/C프로그래밍

복사생성자란 개체의 복사본이 만들어질때마다 자동으로 호출됩니다.
복사생성자에는 두가지의 방식이 있습니다.
얕은 복사와 멤버쪽 복사라는 두가지 방법이 있는데, 얕은 복사는 동일한
메모리를 가르키는 것이고, 멤버쪽 복사는 깊은복사라고도 하며 힙에 할당된
값을 새로 할당된 메모리로 복사합니다.

내용이 약간 어렵지요?
생성자 함수와 소멸자 함수를 배웠습니다.
생성자 함수는 클래스를 만들때 자동으로 호출되며, 개체를 초기화 할수도
있다고 말입니다.
소멸자는의 역활은 생성한 메모리를 없애는 것입니다.
예를 들어 한개의 클래스를 만들고 두개의 개체를 만들었을경우, 한개의 개체
가 소멸자로 인해 해제했을경우, 나머지 하나의 개체의 값을 가르키던 포인터
까지도 값을 잃게 되는 것을 뜻합니다.

따라서 이러한 경우를 방지 하기 위해서는 새로운 영역에 메모리를 할당해야 합니다. 이것이 깊은 복사라고 하는 것입니다.
---------------------   소         스    -------------------
#include<iostream.h>

class Master
{
public:
        Master()
        {
                itsAge=new int;
                itsName=new char;
                itsHobby=new char;
                *itsAge=25;
                itsName="한승헌";
                itsHobby="스타크프트";
        };                
       
        Master(const Master &);//복사 생성자
        ~Master(){};

        int getAge() const {return *itsAge;}
        char *getName() const {return itsName;}
        char *getHobby() const {return itsHobby;}
        void SetAge(int age) {*itsAge = age;};

        void See()
        {
                cout << "나이는 " <<  *itsAge << ": 주소는 " << &itsAge << endl;
                cout << "이름은" <<  itsName << ": 주소는 " <<  &itsName << endl;
                cout << "취미는" <<  itsHobby << ": 주소는 " <<  &itsHobby << endl;
        }
private:
        int  *itsAge;
        char *itsName;
        char *itsHobby;
};

Master::Master(const Master &rhs)    //참조1. 아래부분에 설명있어요.
//여기서 rhs라는 매개 변수는 복사 생성자
//에 대해서는 일반적으로 rhs를 사용한다고 합니다.
// 다른걸 써도 무방하단 말이겠죠? ^^
{
        itsAge=new int;
        itsName=new char;
        itsHobby=new char;
        *itsAge=rhs.getAge();
        itsName=rhs.getName();
        itsHobby=rhs.getHobby();
};

void main()
{
        Master Han;
        cout << "\nHan클래스의 값\n";
        Han.See();
        cout << "\nHan클래스의 나이를 20으로 수정\n";
        Han.SetAge(20);

        cout << "\nHan2클래스를 복사 생성자를 사용하여 Han을 복사하였음 \n";
        Master Han2(Han);
        cout << "\nHan클래스의 값\n";
        Han.See();
        cout << "\nHan2클래스의 값\n";
        Han2.See();

        cout << "\nHan클래스의 나이를 21으로 수정\n";
        Han.SetAge(21);
        cout << "\nHan클래스의 값\n";
        Han.See();
        cout << "\nHan2클래스의 값\n";
        Han2.See();
}
------------------------------------------------------------------

복사 생성자에 대해 알아보았습니다.
복사생성자란 클래스를 복사해서 새로 만든다는 정도로 이해하시면 될꺼 같군요.
위에 복잡한 주소들은 이해를 돕기 위한거니.. 주소 때문에 헷갈리신다면
과감히 주소를 보지 마세요 ;;;;;;

점점 복잡해 지는군요 ;;;;;;
클래스 부분이 좀 헷갈리면서도 아리송하지만.. 무언가 했다는 성취감이 드는
부분이네요 ^^;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
>>ㅑ~~~~~~~~~~~~~

참조1.에 대한 설명
rhs란(right hand side)의 약자입니다.
할당할때 매개 변수로 전달된 개체가 등호의 오른쪽에 있어서 그런
이름이 붙었다는 군요.. 믿거나 말거나 ;;;;;;;

ex>
        itsName=rhs.getName();
        itsHobby=rhs.getHobby();

추천학원:
http://www.it-bank.or.kr/prom/c_main.htm

C/C언어/VC++/C프로그래밍 C/C언어/VC++/C프로그래밍C/C언어/VC++/C프로그래밍 C/C언어/VC++/C프로그래밍C/C언어/VC++/C프로그래밍 C/C언어/VC++/C프로그래밍C/C언어/VC++/C프로그래밍 C/C언어/VC++/C프로그래밍C/C언어/VC++/C프로그래밍 C/C언어/VC++/C프로그래밍C/C언어/VC++/C프로그래밍 C/C언어/VC++/C프로그래밍

Posted by 김윤석

카테고리

놀며즐기고 공부하기 (685)
 IT 정보 (653)
 재테크 (0)
 엔터테이먼트 (11)
 인터넷마케팅 (0)
 사이트 추천 (1)
사이드바 열기