강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

최지로님의 프로필 이미지
최지로

작성한 질문수

홍정모의 따라하며 배우는 C++

9.1 산술 연산자 오버로딩 하기

2:43분에서 add 함수 부분이 이해가 안가네요 ㅠ

작성

·

218

0

 

#include <iostream>

#include<cstdlib> //rand(), srand()

#include<ctime> //time()

 

using namespace std;

 

class Cents

{

private:

    int m_cents;

public:

    Cents(int cents = 0)

    {

        m_cents = cents;

    }

 

    int getCents() const // 멤버함수 const : 멤버변수를 바꾸는 행위를 하지 않는다

    {

        return m_cents;

    }

 

    int& getCents()

    {

        return m_cents;

    }

};

 

void add(const Cents &c1, const Cents &c2, Cents &c_out)

{

    c_out.getCents() = c1.getCents() + c2.getCents();

}

 

int main()

{

    Cents cents1(6);

    Cents cents2(8);

    Cents sum;

 

    add(cents1, cents2, sum);

 

    cout << sum.getCents() << endl;

 

    return 0;

}

한번 다 듣고

다시듣고 따라하면서 하고 있는데요

2:43분까지 따라했는데

add 부분이 이해가 안됩니다

 

정확히는 add함수의 매개변수인 Cents &c_out 부분이요

왜 c_out는 int getCents()const 함수에 접근을 못하는건가요?

왜 int& getCents() 함수를 따로 만들어야 되나요??

퀴즈

사용자 정의 타입에 대해 연산자 오버로딩을 하는 주된 목적은 무엇일까요?

코드 실행 속도를 빠르게 하기 위해

사용자 정의 타입을 내장 타입처럼 자연스럽게 사용하기 위해

객체의 메모리 관리를 자동화하기 위해

클래스의 상속 관계를 정의하기 위해

답변 1

1

안녕하세요!

이 부분은 <8.9 클래스와 const> 강의를 다시 참고하시고 R-value, L-value 개념을 상기해보시면 이해 되실 것 같아요.

const 객체는 int getCents()const 처럼 const 가 뒤에 붙은 멤버 함수만 호출할 수 있구요, const 가 아닌 객체는 int getCents()const 를 호출할 수 없습니다. 즉, c_out 이 int getCents()const 를 호출하려면 c_out 도 const 여야 한다는 것입니다. 

근데 c_out 이 const 면 값을 바꿀 수가 없죠. 지금 Add 가 하는 일은 c_out 에 덧셈 결과를 저장하는 일이니까요. 더군다나 메모리의 값이 바뀌어야하므로 L-value 로서 작용되야 합니다. 따라서 c_out 은 int& 함수를 호출한거구요! 

최지로님의 프로필 이미지
최지로
질문자

아 그렇군요

그렇다면 int getCents() const 이 함수를 없애고
add함수 매개변수에서도 const를 지운후 해도 되는데

굳이 const를 사용해서 함수를 하나 더 만든 이유는

const로 값이 안바꾸게 하기 위함이군요??

예전 강의에서 왠만하면 const를 쓰는게 좋다고 하셨으니까요

 

"예전 강의에서 왠만하면 const를 쓰는게 좋다고 하셨으니까요" 라고 하셨는데 이 부분은 저도 왜 그렇게 말씀하셨는지 잘 모르겠네요. 강의를 봐야 알 수 있을 것 같아요!

이 말씀에 대해 제가 생각하기론, const 레퍼런스 쓰면 일단 첫번째로 수정을 안한다는 것을 확실히 할 수 있구요, 두번째로 L-value, R-value 둘 다 참조할 수 있기 때문에 말씀하신게 아닐까 싶네요. 

최지로님의 프로필 이미지
최지로
질문자

감사합니다!

최지로님의 프로필 이미지
최지로

작성한 질문수

질문하기