프로그래밍C++ 개발자

const-correctness는 C++에서 어떻게 작동합니까? const 한정자를 사용하는 것이 중요한 이유는 무엇이며, const-correctness가 피할 수 있는 오류는 무엇입니까? 메서드와 함수에서 const 사용의 실제 예를 제시하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변.

const-correctness는 C++에서 변수, 포인터, 참조 및 메서드를 "읽기 전용"으로 표시하는 방식을 정의하는 개념입니다. 이는 코드의 안정성을 높이고 클래스 인터페이스를 보다 명확하게 하며 컴파일러가 실행 중이 아닌 컴파일 단계에서 오류를 찾아낼 수 있도록 합니다.

const 한정자를 사용하는 것은 중요한데 그 이유는:

  • 어떤 메서드와 함수가 객체/데이터를 변경하지 않는지를 명확히 구분할 수 있게 합니다.
  • 변경되어서는 안 되는 데이터를 우연히 수정하는 것을 방지합니다.
  • 컴파일러가 코드를 최적화하는 데 도움을 줍니다.

예제:

class MyArray { public: int getItem(size_t idx) const { // 객체를 변경하지 않음 return arr[idx]; } void setItem(size_t idx, int value) { arr[idx] = value; } private: int arr[10]; };

여기서 메서드 getItem은 객체를 변경하지 않음을 보장합니다.

함정 질문.

다음의 차이점은 무엇입니까?

void foo(const int* ptr);

void foo(int* const ptr);

?

올바른 답변:

  • const int* ptr — 상수 값에 대한 포인터, 값을 변경할 수 없음, 포인터는 변경 가능함.
  • int* const ptr — 변경 가능한 값에 대한 상수 포인터, 포인터는 변경할 수 없음, 값은 변경 가능함.

이 주제에 대한 이해 부족으로 인해 발생한 실제 오류의 예.


이야기
대규모 프로젝트에서 const 한정자가 없는 클래스 메서드가 작성되었습니다:

int MyClass::getVal();

이로 인해 해당 클래스의 객체를 const 참조로 사용할 수 없게 되었습니다. 이는 "읽기 전용" 객체만을 처리하는 함수에서의 재사용성을 제한하고 객체의 불필요한 복사를 초래했습니다.


이야기
개발자가 실수로 비상수 메서드로 내부 데이터에 대한 참조를 반환했습니다:

int& MyClass::getInt();

결과적으로 클라이언트 코드가 클래스의 비공식 필드를 변경할 수 있게 되어 예상치 못한 상태 변경과 쉽게 파악하기 힘든 버그가 발생했습니다.


이야기
함수에서 const 매개변수를 const 없이 남겨두었습니다:

void printVector(std::vector<int>& v);

누군가 디버깅을 위해 함수 내에서 벡터를 수정하는 실수를 저질렀고 이 코드를 제거하는 것을 잊었습니다. 이는 테스트에서 거의 눈에 띄지 않는 부작용을 일으켰고 프로덕션에서만 발견되었습니다.