ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C++ 복사생성자/대입연산자
    Programing/C and CPlusPlus 2012. 7. 4. 16:06

    □ 복사생성자 (copy constructor)
     객체와 객체가 복사될때 호출되는 생성자 함수

     

    □ 복사생성자 호출시점
     1. 객체생성시 객체에 인수로 전달
     2. 함수호출시 객체를 인수로 전달
     3. 함수에서 객체를 리턴할때

    ###cpp

     

    #include <iostream>
    #include <iomanip>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>

    using namespace std;


    class Star
    {
    private:
        char *name;
        int age;
    public:
        Star();
        Star(char *, int);
        ~Star();
        Star::Star (Star &_s);
        Star& operator=(Star &);

    void Disp() const;

    } ;

     

    Star::Star():age(0)
    {
        name = new char [strlen("이름 무") +1];
        strcpy (name, "이름무");
        cout << " [ 인자 없는 생성자 ] " << endl;
    }

     

    Star::Star(char *_n , int _a):age(_a)
    {
    #if 0
        name = _n;
        cout << "strlen : " << strlen(_n) << endl;
    #endif
        name =  new char [strlen(_n) + 1];
        strcpy (name, _n);
        cout << " [ 인수 2개 생성자 ] " << endl;
    }

     

    Star::~Star()
    {
         cout << " [ 소멸자 ] " << endl;

    if (name) {
        cout << "name " << name << endl;   // if 사용자 정의 복사생성자/대입연산자 에서 복사가 이뤄지지 않을 경우 crash 발생
        delete[] name;
    }

    }


    /*//////////////////////////////////////////////////////////
     복사 생성자 정의 필요
     if not, destructor 시 delete [] 에서 crash
     because    Star t = s1; ->> 복사 생성자
     소멸시 stack 의 경우 나중에 선언된 변수 t 가 우선 소멸되며
     차례로 s2 - > s1 순서로 해제된다. 이때 s1 에서 t에서 해지한 name 을
     다시 해지하려고 하여 crash 발생
    ///////////////////////////////////////////////////////////*/
    Star::Star (Star &_s):age(_s.age)
    {
        name =  new char [strlen(_s.name) + 1]; // 복사 필요
        strcpy (name, _s.name);        // 복사 필요
        age = _s.age;
        cout << " [ 구조체 생성자 ] " << endl; 
    }


    Star& Star::operator=(Star & _s)
    {
        cout << "operator" << endl;

    if (name)
        delete[] name;

    name = new char [strlen(_s.name) + 1];  // 복사 필요
    strcpy (name, _s.name);     // 복사 필요
    age = _s.age;

    return *this;

    }
    /////////////////////////////////////////////////////////////////


    void Star::Disp () const
    {
        cout << setw(10) << name << setw(7) << age << "살" << endl;
    }

    int main()
    {
         Star s1("아이유" , 20);
         Star s2("김수현" , 25);
    #if 1
         Star t;   // 인수 없는 생성자
         t = s1;   // 있으나 마나 대입 생성자
    #else
         Star t = s1  // 복사 생성자
    #endif
         s1 = s2;  // 있으나 마나 대입 생성자
         s2 = t;   // 있으나 마나 대입 생성자

     s1.Disp();
     s2.Disp();

     cout << " Star = " << sizeof(Star) << endl;
     cout << "******************************* " << endl;

     Star *p = new Star;
     if (p == NULL) {
      cout << " 동적 할당 실패 " << endl;
     }

    return 0;

    }

     

     

    'Programing > C and CPlusPlus' 카테고리의 다른 글

    [C] Key Press  (0) 2019.03.04
    [C++] 키입력을 위해 curses.h 사용하기  (0) 2019.03.04
    [C++] Exception overloading  (0) 2019.02.25
    [C++] std::bind  (0) 2016.07.27
    C++ Programing  (0) 2014.02.23

    댓글

Designed by Tistory.