less than 1 minute read

복사 생성자와의 첫만남


C++ 스타일의 초기화


// C style
int num = 20;
int &ref = num;

// C++ style

int num(20);
int &ref(num);


class SoSimple
{
    private :
        int num1;
        int num2;
    
    public :
        SoSimple(int n1, int n2) : num(n1), num2(n2)
        {}

        void ShowSimpleData()
        {
            cout<<num1<<endl;
            cout<<num2<<endl;
        }
};

int main(void)
{
    SoSimple sim(15,20);
    SoSimple sim2 = sim1;

    sim2.ShowSimpleData();
    return 0;

}

키워드 explicit

  • SoSimple sim2 = sim1; -> SoSimple sim2(sim1)

  • 이러한 묵시적 형변환은 복사 생성자를 explicit 으로 선언하면 막을 수 있다.

깊은 복사와 얕은 복사


디폴트 복사 생성자의 문제점

  • 얕은 복사 : 객체 소멸시 문제 발생
  • Person man2 = man1;

깊은 복사를 위한 복사 생성자의 정의

Person(const Person& copy) : age(copy.age)
{
    name=new char[strlen(copy.name)+1];
    strcpy(name, copy.name);
}

복사 생성자의 호출 시점


복사 생성자가 호출되는 시점

  1. 기존에 생성된 객체를 이용해서 새로운 객체를 초기화 하는경우

Person man("Lee dong woo", 29);

Person man2 = man1;

  1. Call-by-value 방식의 함수 호출 과정에서 객체를 인자로 전달하는 경우

  2. 객체를 반환하되, 참조형으로 반환하지 않는경우


SoSimple SimpleFuncObj(SoSimple ob)
{
    return ob;

}

int main(void)
{
    SoSimple obj;
    SimpleFuncObj(obj);
    ...
}

Categories:

Updated: