2008-09-08 5 views
8

다음과 같은 선언이 주어집니다 :const 연산자는 C++에서 메서드와 함께 사용될 때 무엇을 의미합니까?

class A { 
public: 
    void Foo() const; 
}; 

그것은 무엇을 의미합니까?

Google이이를 나타냅니다.

const (this) 객체에서 작동 할 수있는 멤버 함수는 const 키워드로 선언해야합니다. 함수가 const로 선언되지 않으면, in은 const 객체에 적용될 수 없으며 컴파일러는 오류 메시지를 표시합니다.

하지만 다소 혼란 스럽습니다. 거기 누구든지 더 나은 조건으로 그것을 넣을 수 있습니까?

고마워.

답변

12

클래스의 변형을 고려하십시오 A.

class A { 
public: 
    void Foo() const; 
    void Moo(); 

private: 
    int m_nState; // Could add mutable keyword if desired 
    int GetState() const { return m_nState; } 
    void SetState(int val) { m_nState = val; } 
}; 

const A *A1 = new A(); 
A *A2 = new A(); 

A1->Foo(); // OK 
A2->Foo(); // OK 

A1->Moo(); // Error - Not allowed to call non-const function on const object instance 
A2->Moo(); // OK 

함수 선언에 const 키워드는 함수가 A의 상태를 수정하지 계약 의무가 컴파일러에 나타냅니다. 따라서 함수를 A::Foo 내에서 호출하거나 멤버 변수의 값을 변경할 수 없습니다. 이 비로서 선언 A::SetState를 호출 할 수있다

설명하기 푸()const, A::GetStateconst 명시 적 선언되기 때문에 괜찮다. 회원 m_nState은 키워드 mutable으로 신고하지 않는 한 변경 될 수 없습니다.

const의이 사용 예 중 하나는 'getter'함수가 멤버 변수의 값을 얻는 것입니다.

@ 1800 정보 : 변경 될 수 있음을 잊어 버렸습니다!

mutable 키워드는 컴파일러 오류가 발생할 수있는 멤버 변수 수정을 컴파일러에 허용하도록 컴파일러에 지시합니다. 함수가 상태를 수정해야하지만 수정과 관계없이 객체가 논리적으로 일관성이 있다고 간주 될 때 사용됩니다.

+0

위대한 대답 - 정말 분명하고 간결합니다. 내 +1을 얻었다. –

1

. 예를 들어

const A obj = new A(); 

개체 CONST, 즉 객체 호출 할 수있는 유일한 멤버 함수는 함수 CONST 선언된다

class A 
{ 
    int x; 
    mutable int y; 

    void f() const 
    { 
     x = 1; // error 
     y = 1; // ok because y is mutable 
    } 
}; 
3

기능은 어떤 멤버 변수를 수정할 수 없습니다 객체의 멤버 변수를 변경할 수 없습니다 원인이됩니다

2

C++ 객체 const를 선언 할 수있다. 객체를 const로 만드는 것은 객체를 읽기 전용으로 해석 할 수 있습니다. const 오브젝트는 변경할 수 없습니다. 즉, 오브젝트의 데이터 멤버를 변경할 수 없습니다. 멤버 함수 const를 선언하면 함수가 개체의 데이터 멤버를 변경할 수 없습니다.

+0

오류 ... const A * obj = new A(); ... 당신은 "별"을 잊어 버렸습니다 ... :-) – paercebal

5

이것은 대답이 아니며 단지 부연 설명입니다. 가능한 한 많은 변수와 상수를 선언하는 것이 좋습니다. 이 좋습니다.

  1. 이것은 사용자의 의도를 클래스 사용자 (심지어 사용자 자신)에게 전달합니다.
  2. 컴파일러는 이러한 의도에 대해 정직하게 유지합니다. 즉, 컴파일러가 확인한 문서와 같습니다.
  3. 이 정의에 따르면 예상하지 못한 상태 변경을 방지하고 가능하면 합리적인 가정을 할 수 있습니다.
  4. const은 코드를 통해 전파하는 재미있는 방법이 있습니다. 따라서 가능한 한 자주 그리고 빨리 const을 사용하는 것이 좋습니다. const 게임을 시작할 때 늦게 코드를 작성하는 것은 쉽지 않지만 쉽지는 않을 것입니다.

정적 인 언어를 사용하는 경우 컴파일 시간을 확인하는 것은 가능하면 최대한 많이 사용하는 것이 좋습니다 ... 실제로는 또 다른 종류의 테스트입니다. 경험에서

2

두 건의 모범 사례 : 때마다 수

(1) 는 const를 함수를 선언합니다. 처음에는이 작업을 추가 작업으로 만 알았지 만 f (const Object & o)와 같은 서명이있는 함수에 객체를 전달하기 시작했고 갑자기 o.GetAValue()와 같은 f의 줄에 컴파일러가 barfed되었습니다. GetAValue를 const 함수로 표시하지 않았기 때문입니다. 특히 하위 클래스를 만들고 가상 메서드 버전을 const로 표시하지 않을 때 놀라게 할 수 있습니다.이 경우 기본 클래스에 대해 작성한 적이없는 일부 함수에서 컴파일이 실패 할 수 있습니다.

(2) 실용적인 경우에는 가변 변수을 사용하지 마십시오. 유혹하는 트랩은 게으른 또는 비동기 입출력 작업을 수행하는 "스마트"객체를 작성하는 경우와 같이 읽기 작업에서 상태를 변경하도록 허용 할 수 있습니다. 하나의 작은 변하기 쉬운 변수 (bool과 같은)만으로 이것을 관리 할 수 ​​있다면, 내 경험에 비추어 볼 때이 말이 맞는 것입니다. 그러나 일부 작업을 const로 유지하기 위해 모든 멤버 변수를 변경할 수있는 것으로 표시하면 const 키워드의 목적을 상실하게됩니다. 잘못 될 수있는 것은 클래스가 (const 메소드 만 호출하기 때문에) 클래스를 변경하지 않는다고 생각하는 함수는 코드에서 버그를 호출하고,이 버그가 클래스에 있다는 것을 인식하기까지 많은 노력을 기울일 수 있습니다. 다른 코더 (올바르게)는 const 메서드 만 호출하기 때문에 데이터가 const 인 것으로 가정합니다.

2

const에는 코드를 전달하는 재미있는 방법이 있습니다. 따라서 const를 가능한 한 조기에 자주 사용하는 것이 좋습니다. 게임의 후반부에서 코드를 const로 설정하기로 결정하는 것은 힘들 수 있습니다 (쉽지만 짜증납니다).

또한 const이어야하는 메소드가 없으면 쉽게 문제가 발생합니다! 이렇게하면 코드를 통해 크롤링되고 악화됩니다.

관련 문제