const member function에 관하여 궁금한 점이 있습니다.
강의 중 아래 코드를 작성하고 난 후, 코드를 변형해 보다가 의문의 생겨 질문드립니다.
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 멤버 함수의 의미와 달라지게 되고, 컴파일러는 오류를 발생시킵니다. 👍
2
네, 맞습니다.const 함수는 해당 객체의 상태를 변경하지 않겠다는 것을 보장해야 하지만, string& (참조를 반환하는것) 을 사용하면, 이 반환된 참조를 통해 객체의 상태를 변경할 수 있게 됩니다.
즉, const 함수의 의미와 모순됩니다.
대신에, string getValue() const 또는, cosnt string& getValue() const 와 같은 형태로 선언하는 것이 일반적인 방법입니다.
강의자료는 어디서 받을 수 있죠?
1
20
2
교재 있나요?
1
138
2
11:11 부근에 Something::temp와 Something::getValue의 앞에 &를 붙이는 이유가 뭔가요? (함수 이름은 포인터(주소)가 아닌가요?)
1
91
3
using namespace std; 선언 후에 std::를 하는 이유가 궁금합니다
1
102
2
cstr직접구현
0
116
3
BubbleSort
1
78
2
숙제 마지막 부분
1
79
2
강의와 똑같이 진행했는데 링킹 에러가 발생합니다.
1
95
2
수업할때 레퍼런스로 사용하는 도서는 어떤 도서인가요??
1
164
2
공변반환형 관련 문의 드립니다.
1
90
2
170강 유니크 포인터에대해 질문있습니다
1
81
1
섹션 5 퀴즈의 답이 이상합니다
1
84
2
이중포인터와 배열이 이해가 안됩니다.
1
159
2
5분 17~5분 34초 객체 잘림 질문
1
79
1
Resource.h 코드 알려주세요
1
72
1
char name[] 배열의 길이와 관련해 일부 궁금점이 생겨서 질문합니다
1
94
2
화면좌측 숫자 보이기
1
115
1
화면 좌측 숫자 보이기
0
67
1
처음 c++ 수강하려는데요. 비주얼스튜디오 2022 다운로드해서 설치하면 되는건가요??
1
138
3
46강 string 버퍼 질문입니다
1
81
2
프로그래머스 수열과 구간 쿼리 2 문제 질문입니다.
1
124
2
[] 범위 검사시 assert 사용 관련 질문
1
90
2
Lecture 클래스 멤버변수 명명 관련
0
92
2
프로그래머스의 대소문자 바꿔서 출력하기 문제를 푸는데요
0
74
1





