인프런 커뮤니티 질문&답변
const member function에 관하여 궁금한 점이 있습니다.
해결된 질문
작성
·
306
1
강의 중 아래 코드를 작성하고 난 후, 코드를 변형해 보다가 의문의 생겨 질문드립니다.
class Something {
public:
string m_value = "default";
const string& getValue() const {
cout << "const version" << endl;
return m_value;
}
string& getValue() {
cout << "non-const version" << endl;
return m_value;
}
};영상에서 const member function은 함수 내에서 멤버 변수를 수정하지 않겠다는 의미라고 나왔습니다.
그런데 해당 함수의 반환 타입에 해당하는 const를 지우자 에러가 발생합니다. const member function이 아닌 getValue()와 하는 작업이 같은데도 불구하구요.(둘 다 함수 내부에서 값을 변경하지 않음)
string& getValue() const {
cout << "const version" << endl;
return m_value; // 오류 발생
}오류문을 검색하여 유사한 질문을 찾을 수 있었습니다.
링크의 답변을 읽고 제가 이해한 바는 다음과 같습니다 : 함수의 반환형이 참조형이라면 잠재적으로 접근하여 값을 변경할 가능성이 있는데, 본 함수는 const member function라서 함수의 멤버 변수가 변하지 않아야 하기에 이를 보장하기 위하여 수정하도록 에러를 발생시킨다고 보면 될까요?
오류가 발생하던 함수의 형태에서 &와 const 둘 중 하나를 지웠을 때 에러가 사라지는 것을 보면 맞는 것 같긴 한데, 정확한 설명을 듣고 싶습니다.
답변 1
3
안녕하세요, 질문&답변 도우미 Soobak 입니다.
네, 말씀하신 내용이 맞습니다.
const 멤버 함수에서는 객체의 상태를 변경할 수 있는 어떤 방법도 제공해서는 안 되며, 이는 반환 값에 대해서도 동일하게 적용됩니다.
string& getValue() const 함수는 const 멤버 함수이므로, 객체의 상태를 변경할 수 없어야 합니다.
하지만, 여기서 반환형은 string& 즉, 문자열에 대한 참조입니다.
이는 반환된 문자열이 수정 가능하다는 것을 의미하기 때문에 const 멤버 함수의 의미와 달라지게 되고, 컴파일러는 오류를 발생시킵니다. 👍






답변 감사합니다. 그럼
string& getValue() const와 같은 형태의 함수는 아예 선언할 수 없다고 보면 될까요?