대입 연산자

2024. 3. 21. 17:56프로그래밍/C++

단순 대입 연산자는 구조체나 클래스에도 적용됩니다.

이때 기억해야 할 점은 기본적으로 단순 대입을 시도하면 얕은 복사가 수행된다는 점이다.

이를 해결하기 위해선 단순 대입 연산자의 동작 방식을 수정해야 한다.

//단순 대입 연산자 함수를 정의한다
CMyData& operator=(const CMyData &rhs)
{
    *m_pnData = *rhs.m_pnData;
    
    //객체 자신에 대한 참조 반환
    return *this;
}

 

 

 
#include <iostream>
using namespace std;

class CMyData
{
public:
    CMyData(int nParam)
    {
        m_pnData = new int;
        *m_pnData=nParam;
    }

    CMyData(const CMyData &rhs)
    {
        cout<<"CMyData(const CMyData &)"<<endl;

        m_pnData = new int;

        *m_pnData = *rhs.m_pnData;
    }

    ~CMyData()
    {
        delete m_pnData;
    }
    
    //단순 대입 연산자 함수를 정의한다.
    CMyData& operator=(const CMyData &rhs)
    {
        *m_pnData = *rhs.m_pnData;

        return *this;
    }

    int GetData()
    {
        if(m_pnData != NULL)
            return *m_pnData;

        return 0;
    }

private:
    int *m_pnData = nullptr;

};

int main()
{
    CMyData a(10);
    CMyData b(20);

    a=b;
    cout<<a.GetData()<<endl;

    return 0;
}

 

CMyData::operator=(CMyData const&)

만약 a=b operator가 다음 과 같이 정의된다면 a와 b모두 같은 주소를 가리키기 때문에 a의 소멸자 동작할 때 포인터가 가리키는 값을 해제시키지 못한 b로 인해 에러가 날 것이다

    CMyData& operator=(const CMyData &rhs)
    {
        m_pnData = rhs.m_pnData;

        return *this;
    }

'프로그래밍 > C++' 카테고리의 다른 글

대입 vs 복사  (0) 2024.03.22
Pass by value VS Pass by reference  (0) 2024.03.21
깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy)  (0) 2024.03.20
복사 생성자  (0) 2024.03.20
Dynamic vs Static  (0) 2024.03.19