2013-03-11 2 views
2

나는 지금이 멤버 함수를 const 선언함으로써, 우리는 클래스 데이터를 수정 자제 컴파일러에게 const 멤버 함수에 대한 Ecekl로 작성이 const 멤버 함수가 정적 멤버 데이터를 수정하는 이유는 무엇입니까?

Class Obj{ 
    static int i,j; 
    public: 
    void f() const {cout<<i++<<endl;} 
    void f() const {cout<<i++<<endl;} 
}; 
int Obj::i=47; 
int Obj::j=11; 

++ C에서 Eckel-Thining에서 다음 코드 줄을이 . 나는 const와 같은 특정한 경우에이 포인터의 const를 명시 적으로 버림으로써 우리는 그걸 막을 수 있다고 생각하지만 여기서는 둘 다 일어나지 않고 ++와 j ++는 잘 동작한다. 왜 그래야만하지?

+6

정적 멤버는 개체의 일부가 아닙니다. – chris

+0

하지만 수업에 비공개로 선언됩니다. 그것만이 모든 객체에 대해 하나의 고유 한 저장소를 가지고 있다는 것입니다. –

+1

정확히, 그래서 그들은 어떤 물건에도 속하지 않습니다. 객체가 생성되기 전에 존재합니다. – chris

답변

6

const은 객체 (this 포인터가 const) 인 경우에만 static members을 수정하는 것이 허용됩니다. const 멤버 함수에

+0

: 정적 멤버를 수정할 수있는 이유는 무엇입니까? 나는 그들이 정적이거나 모든 사물들 사이에서 공유 되더라도 수업의 일부라는 것을 의미합니다. –

+0

@KavishDwivedi 그들은 클래스가 아니라 객체의 일부입니다. – ForEveR

+0

그래서 const member 함수는 객체의 constness를 유지 관리합니다. 즉, 참조 (int & x)가 전용 멤버 일지라도 const 멤버 함수를 통해 수정할 수 있습니다. –

2

함수가 CONST 액세스 경로를 통해 액세스 호출되는 오브젝트; 그러므로 const 멤버 함수는 객체와 그것의 비 정적 데이터 멤버를 수정해서는 안된다.

소스 : 당신이 볼 수 있듯이 someone cites c++ standard

, 정적 데이터 멤버가 const로 C 당 ++ 표준에 의해 보호되지 않습니다.

관련 문제