const
은 구현 세부 정보가 아니라 프로그램 의미에 관한 것입니다. 개체의 표시 상태가 변경되지 않을 때 멤버 함수 const
을 표시해야하며 자체 개체 인 const
에서 호출 가능해야합니다. 클래스 X
에있는 const
멤버 함수 내에서 this
의 유형은 X
개체에 대한 포인터 인 X const *
입니다. 따라서 모든 멤버 변수는 해당 멤버 함수 내에서 const
입니다 (mutable
멤버 제외). const
개체가있는 경우에는 const
회원 기능 만 호출 할 수 있습니다.
mutable
을 사용하면 멤버 변수가 const
멤버 함수 내에서 변경 될 수 있음을 나타낼 수 있습니다. 이것은 일반적으로 결과 캐싱에 사용되는 변수를 식별하거나 mutexes와 같이 실제 관찰 가능한 상태에 영향을주지 않는 변수 (즉, const
멤버 함수에서 뮤텍스를 잠글 필요가 있음)를 사용하거나 카운터를 사용하는 데 사용됩니다.
class X
{
int data;
mutable boost::mutex m;
public:
void set_data(int i)
{
boost::lock_guard<boost::mutex> lk(m);
data=i;
}
int get_data() const // we want to be able to get the data on a const object
{
boost::lock_guard<boost::mutex> lk(m); // this requires m to be non-const
return data;
}
};
당신은 그 포인터가 const
멤버 함수에 const
이된다 (예 : std::auto_ptr
또는 boost::shared_ptr
같은 스마트 포인터 포함),하지만 -을 지적 데이터를 수정할 수 없습니다 때문에 직접 포인터보다는하여 데이터를 보유하는 경우 포인트 된 데이터
캐싱과 관련 : 일반적으로 컴파일러는 상태가 호출간에 변경 될 수 있으므로 (특히 뮤텍스가있는 다중 스레드 예제에서) 컴파일러가이를 수행 할 수 없습니다. 그러나 정의가 인라인이라면 컴파일러는 코드를 호출 함수로 끌어 올 수 있고 거기에서 볼 수있는 것을 최적화 할 수 있습니다. 이로 인해 함수가 실제로 만 호출 될 수 있습니다.
C++ Standard (C++0x) 다음 버전의 새 키워드는 constexpr
입니다. constexpr
태그가 지정된 함수는 상수 값을 반환하므로 결과를 캐시 할 수 있습니다. 컴파일러가이 사실을 확인할 수 있도록하기 위해서 당신이 할 수있는 일에는 한계가있다.
아! constexpr 아마 내가 생각하고 있었어! 감사. – Ferruccio
당신은 내 하루를 보냈습니다. 나는 항상 필요한 것은 모두 '변경 가능하다'라는 것을 몰랐다. 고맙습니다. – lucastamoios