>  기사  >  백엔드 개발  >  C++ 컴파일 오류: const가 아닌 객체는 const 멤버 함수를 호출할 수 없습니다. 어떻게 해결합니까?

C++ 컴파일 오류: const가 아닌 객체는 const 멤버 함수를 호출할 수 없습니다. 어떻게 해결합니까?

PHPz
PHPz원래의
2023-08-21 21:33:061141검색

C++ 컴파일 오류: const가 아닌 객체는 const 멤버 함수를 호출할 수 없습니다. 어떻게 해결하나요?

C++에서 const 멤버 함수는 함수 선언 뒤에 const 키워드를 추가하는 것을 의미합니다. 이는 함수가 객체의 상태를 수정하지 않는다는 의미입니다. 객체가 const 유형인 경우 const가 아닌 일반 멤버 함수는 호출할 수 없지만 const 멤버 함수는 호출할 수 있습니다. 그러나 const가 아닌 개체가 const 멤버 함수를 호출하면 컴파일 중에 다음 오류가 발생합니다. const가 아닌 개체는 const 멤버 함수를 호출할 수 없습니다.

이 오류는 일반적으로 다음 두 가지 상황에서 발생합니다.

  1. 비-const 개체가 const 멤버 함수를 호출합니다.

예:

class Example {
public:
  void doSomething() const {
    // const function
  }
};

int main() {
  Example obj;
  obj.doSomething(); // 编译错误
  return 0;
}

const 멤버 함수가 비-const 개체에서 호출되면 컴파일러는 위의 오류가 발생합니다. 이는 객체의 상태가 함수에 의해 변경될 수 있고 컴파일러는 const 멤버 함수가 실제로 객체를 수정하지 않는지 여부를 알 수 없기 때문입니다.

해결책:

이 오류를 방지하려면 호출 개체를 const로 표시해야 합니다. 이는 객체 유형 뒤에 const 키워드를 추가하여 달성할 수 있습니다. 예:

const Example obj;
obj.doSomething(); // 正确,因为 obj 是 const 类型的
  1. const 객체는 const가 아닌 멤버 함수를 호출합니다.

예:

class Example {
public:
  void doSomething() {
    // non-const function
  }
};

int main() {
  const Example obj;
  obj.doSomething(); // 编译错误
  return 0;
}

이 경우 객체는 const 유형이므로 , 컴파일러는 객체의 상태를 수정할 수 없다고 간주하여 const가 아닌 멤버 함수 호출을 거부합니다.

해결 방법:

객체의 상태를 꼭 수정해야 하는 경우 객체를 non-const 유형으로 변환할 수 있습니다. 이는 유형 변환 연산자 const_cast를 사용하여 달성할 수 있습니다. 예:

const Example obj;
const_cast<Example&>(obj).doSomething(); // 正确,但不建议这样做

유형 변환에 const_cast를 사용하면 정의되지 않은 동작이 발생할 수 있으므로 형식 코드에서는 사용을 피해야 합니다.

요약

위는 두 가지 일반적인 C++ 컴파일 오류에 대한 솔루션입니다. 즉, const가 아닌 개체는 const 멤버 함수를 호출할 수 없습니다. 코드를 작성할 때 const 멤버 함수를 const로 표시하고 const 개체에서 const가 아닌 멤버 함수를 호출하지 않도록 주의해야 합니다. const 객체의 상태를 정말로 수정해야 하는 경우 유형 변환을 위해 const_cast를 사용해야 하지만 형식 코드에서는 사용을 피해야 합니다.

위 내용은 C++ 컴파일 오류: const가 아닌 객체는 const 멤버 함수를 호출할 수 없습니다. 어떻게 해결합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.