본문 바로가기
프로그래밍 언어/C++

C++ 5단원 복습! (1편)

by 조엘 2020. 3. 22.

안녕하세요. 파피몬입니다.

 

이 복습 내용은 최호성 선생님의 "이것이 C++이다"를 공부하고 작성하였습니다. 

아직 모르는 게 많은 학생이라 오개념이 있을 수 있습니다. 친절하게 댓글로 알려주시면 좋은 공부 될 것 같습니다!!

5단원에서는 연산자 다중정의에 대해서 배워봅니다. 1편, 2편으로 나누어져 있습니다.

 

Chapter 5. 연산자 다중정의

 

1. C++에서는 연산자의 재정의 / 다중정의를 지원한다. 연산자 다중정의로 사용자는 직관적인 class 사용이 가능해진다. 그렇기에! 기본 연산은 제작자가 아주 잘, 실패 없이 만들어 놔야한다!

 ** 논리 연산자 ( ! , && , || 등 ) 는 절대 다중 정의하면 안 된다! 심각한 논리적 오류로 이어짐

 ** 산술 연산자, 대입 연산자, 관계 연산자(1편), 배열 연산자, 단항 증감 연산자(2편)에 대해서 알아보도록 한다.  

 

 

2. 산술 연산자에서는 '더한다' 와 같이 어찌 정의하느냐에 따라 달라지는 결과를 조종할 수 있다. 

int형 멤버 변수 하나가 있는 CMyData라는 class가 있다고 가정하자. 

int main()
{
    CMyData a(0), b(3), c(4);
    // b + c 연산으로 임시객체 생성
    // a = 임시객체 대입
    a = b + c;
    return 0;
}

a = b + c; 라는 코드를 조금 더 메서드스럽게(?) 작성하면 다음과 같다

a.operator=(b.operator+(c)); 

//1번
CMyData operator+(const CMyData &rhs)
{
    cout<<"operator+"<<endl;
    CMyData result(0);
    result.m_nData = m_nData + rhs.m_nData;
    return result;
}

//2번
CMyData& operator=(const CMyData &rhs)
{
    cout<<"operator="<<endl;
    m_nData = rhs.m_nData;
    return *this;
}

1번 코드에 b.operator+(c); &rhs에 c가 매개변수로 넘어가고 연산을 수행하게 된다. 여기서 연산 과정에서 b,c의 값을 변화시키지 않고 새로운 덧셈 결과값이 필요하기에 임시객체를 피치 못하게 사용하게 된다. 

만약 이동 생성자를 만들어 주었다면 메모리 사용을 최소화 하여 연산을 수행할 수 있다. 

이후 2번 코드에 a.operator=(임시 객체); 연산을 수행하면 된다. 

 

 

3. 단순 대입 연산자를 다룰 때에는 특수한 경우도 고려해야 한다. 예를 들어 a=a; a=b=c; 등과 같은 코드는 함수 안에서 메모리를 해제하거나 void를 반환 했을 경우 각각 오류를 일으키게 된다. 이를 해결한 코드는 다음과 같다. 

// 객체를 반환해 줌으로 a = b = c; 와 같은 코드 해결!
CMyData& operator=(const CMyData &rhs)
{
    // a = a; 와 같은 코드 해결!
    if(this == &rhs)
        return *this;
    
    //class에 int*변수 m_pnData가 정의되어 있다고 가정한다
    delete m_pnData;
    m_pnData = new int(*rhs.m_pnData);
    
    return *this;
}

 

 

4. 임시 객체를 반환 하는 것을 대입해 줄 경우, 임시 객체를 r-value 참조로 즉시 단순 대입을 진행할 수 있는데, 이때는 이동 대입 연산자가 호출되게 할 수 있다. 위에 예시를 들었던 a = b + c; 같은 경우가 해당 되겠다. 

CMyData& operator=(CMyData &&rhs)
{
    // 얕은 복사를 수행한 후 원본은 NULL로 지정!
    m_pnData = rhs.m_pnData;
    rhs.m_pnData = NULL;
    
    return *this;
}

 

 

5. 관계 연산자 ( ==, !=, >, < 등) 의 리턴값은 int형으로 참이면 1, 거짓이면 0을 반환한다.

가장 흔하게 클래스에 ==, != 연산자가 쓰이는 경우는 '문자열' 비교입니다. 

int operator==(const CMyString &rhs)
{
    if(m_pszData != NULL && rhs.m_pszData != NULL)
        if(strcmp(m_pszData, rhs.m_pszData) == 0
            return 1;
    
    return 0;
}
반응형

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

행렬 곱셈 최적화 1편  (0) 2020.07.23
C++ 5단원 복습! (2편)  (0) 2020.03.22
C++ 4단원 복습! (2편)  (0) 2020.03.15
C++ 4단원 복습! (1편)  (0) 2020.03.14
C++ 3단원 복습! (2편)  (0) 2020.03.12

댓글