-
카테고리
-
세부 분야
프로그래밍 언어
-
해결 여부
해결됨
const member function에 관하여 궁금한 점이 있습니다.
24.01.24 21:09 작성 조회수 131
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
둘 중 하나를 지웠을 때 에러가 사라지는 것을 보면 맞는 것 같긴 한데, 정확한 설명을 듣고 싶습니다.
답변을 작성해보세요.
2
Soobak
2024.01.25
안녕하세요, 질문&답변 도우미 Soobak 입니다.
네, 말씀하신 내용이 맞습니다.
const
멤버 함수에서는 객체의 상태를 변경할 수 있는 어떤 방법도 제공해서는 안 되며, 이는 반환 값에 대해서도 동일하게 적용됩니다.
string& getValue() const
함수는 const
멤버 함수이므로, 객체의 상태를 변경할 수 없어야 합니다.
하지만, 여기서 반환형은 string&
즉, 문자열에 대한 참조입니다.
이는 반환된 문자열이 수정 가능하다는 것을 의미하기 때문에 const
멤버 함수의 의미와 달라지게 되고, 컴파일러는 오류를 발생시킵니다. 👍
Soobak
2024.01.25
네, 맞습니다.const
함수는 해당 객체의 상태를 변경하지 않겠다는 것을 보장해야 하지만, string&
(참조를 반환하는것) 을 사용하면, 이 반환된 참조를 통해 객체의 상태를 변경할 수 있게 됩니다.
즉, const
함수의 의미와 모순됩니다.
대신에, string getValue() const
또는, cosnt string& getValue() const
와 같은 형태로 선언하는 것이 일반적인 방법입니다.
답변 1