• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

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;    // 오류 발생
}

오류문을 검색하여 유사한 질문을 찾을 수 있었습니다.

https://stackoverflow.com/questions/30146562/error-qualifiers-dropped-in-binding-reference-of-type-x-to-initializer-of-type

링크의 답변을 읽고 제가 이해한 바는 다음과 같습니다 : 함수의 반환형이 참조형이라면 잠재적으로 접근하여 값을 변경할 가능성이 있는데, 본 함수는 const member function라서 함수의 멤버 변수가 변하지 않아야 하기에 이를 보장하기 위하여 수정하도록 에러를 발생시킨다고 보면 될까요?

오류가 발생하던 함수의 형태에서 &const 둘 중 하나를 지웠을 때 에러가 사라지는 것을 보면 맞는 것 같긴 한데, 정확한 설명을 듣고 싶습니다.

 

답변 1

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2024.01.25

안녕하세요, 질문&답변 도우미 Soobak 입니다.

 

네, 말씀하신 내용이 맞습니다.

const 멤버 함수에서는 객체의 상태를 변경할 수 있는 어떤 방법도 제공해서는 안 되며, 이는 반환 값에 대해서도 동일하게 적용됩니다.

string& getValue() const 함수는 const 멤버 함수이므로, 객체의 상태를 변경할 수 없어야 합니다.
하지만, 여기서 반환형은 string& 즉, 문자열에 대한 참조입니다.
이는 반환된 문자열이 수정 가능하다는 것을 의미하기 때문에 const 멤버 함수의 의미와 달라지게 되고, 컴파일러는 오류를 발생시킵니다. 👍

durams님의 프로필

durams

질문자

2024.01.25

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

Soobak님의 프로필

Soobak

2024.01.25

네, 맞습니다.
const 함수는 해당 객체의 상태를 변경하지 않겠다는 것을 보장해야 하지만, string& (참조를 반환하는것) 을 사용하면, 이 반환된 참조를 통해 객체의 상태를 변경할 수 있게 됩니다.
즉, const 함수의 의미와 모순됩니다.

대신에, string getValue() const 또는, cosnt string& getValue() const 와 같은 형태로 선언하는 것이 일반적인 방법입니다.

durams님의 프로필

durams

질문자

2024.01.25

감사합니다!