[C++이란?/5일차] C++ 개념 바로잡기

    728x90

    복사 생성자


    1. 복사생성자

    👉 객체의 복사본을 생서할 때 호출되는 생성자

     

    이것도 생성자와 같이 디폴트 생성자처럼 생략이 가능

    클래스 이름 (const 이름 &rValue);

    상수형 참조이지만 Const도 생략 가능, 특별한 이유가 없다면 해주는 것이 코딩계 원칙

    => 복사를 했는데 원본이 손상되는 것을 막기 위해서

     

    여기서 문제점

    함수로 복사생성자를 호출하는 경우 성능에 안좋은 영향을 준다.

    void TestFunc(CTestData param)
    {
        cout << "Test()" << endl;
        
        param.SetData(20);
    }

     

    바로 이 경우이다!!!

    쓸데없이 매개변수인 param은 호출자 원본을 두고 복사본이 생성되어 객체가 2개가 된다.

     

    해결 방법!!!!!

    1. 극단적으로 복사생성자를 없앤다.

    => 문법적 오류로 대신할 수 있음

     

    이게 중요한 부분!!!

    2. '참조자' 를 사용한다.

    매개변수에 참조자 '&' 하나 넣은 것이 성능의 수준이 달라진다.

    void TestFunc(CTestData &param)
    {
        cout << "Test()" << endl;
        
        param.SetData(20);
    }

     

    하지만 더 깊게 들어가면 여기서도 문제가 보인다.

    사용자가 이 함수를 사용할 때 참조자의 의한 형식인지 알 수 없어서 값이 변경될 수 있다는 점!!

     

    그래서 여기도 const를 붙여주면 좋다.

    void TestFunc(const CTestData &param)
    {
        cout << "Test()" << endl;
        
        param.SetData(20);
    }

     

     

    2. 깊은 복사와 얕은 복사

    👉 복사의 두 형태에 대해 알아보자

     

    2 - 1 얕은 복사

    👉 대상 값은 그대로 하나, 접근 포인터가 두 개

    (책에서 이 부분을 삼각관계라 표현하여 코드로 삼각관계에 대해 설명하는데 흥미로운 설명이었다. 추천!)

     

    int main()
    {
        int *pA, *pB;
        
        pA = new int;
        *pA = 10;
        
        pB = new int;
        pB = pA;
        
        delete pA;
        delete pB;
    }

     

    위와 같은 형태로 복사하는 것을 줄여서 얕복, 즉 얕은 복사라고 한다.

    하지만 얕은 복사의 중요한 문제점이 있다.

     

    바로 delete의 경우이다.

    B는 A를 바라보고 있기 때문에 delete A를 하고 delete B를 하면

    delete A로 지웠던 빈 내용을 delete B로 다시 지우라고 명령한게 되어버린다.

     

    해결 방법!!!!!!

    *pB = *pA;로 수정하면 된다.

    아까는 아예 참조로 복사했지만 이번엔 pA의 값만 pB로 가져왔기 때문에 

    서로 다른 대상을 가리키게 된다.

     

     

    2 - 2 깊은 복사

    👉 실제로 두 개의 값이 생성

     

    m_pData = new int;
    
    *m_pData = *rhs.m_pData;

     

    깊은 복사는 얕은 복사처럼 주소를 같은 값으로 만드는 것이 아닌

    대상의 값을 가져와서 다시 포인터가 가리키는 메모리로 복사하는 것이다.

     


    C++개념 바로잡기는 '이것이 C++이다' 책을 공부한 후 정리하며 쓴 클라이언트 개발 지망생의 공부 노트입니다.

    728x90

    댓글