인프런 커뮤니티 질문&답변
2:43분에서 add 함수 부분이 이해가 안가네요 ㅠ
작성
·
215
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를 쓰는게 좋다고 하셨으니까요