2010-07-25 3 views
3
class A{ 
private: 
    int a; 
public: 
    A() {a = 4;} 
    const int& random1() const {return a; } 
    //int&  random2() const {return a; } 
    const int* random3() const {return &a;} 
    //int*  random4() const {return &a;} 
}; 

int main(){ 
    A objA; 
    cout<<objA.random1()<<"\n"; 
    cout<<*objA.random3()<<"\n"; 
} 

random2()random4()은 위에서 정의한대로 허용되지 않습니다. 나는 어떻게 든이 모든 것을 알았지 만, 오늘까지 내 자신의 코드를 쓰는 동안 그것을 보지 못했습니다.const 멤버 함수에는 무엇이 허용되지 않습니까?

이 두 경우를 제외하고 모두 const 멤버 함수에서 허용되지 않습니다.

C++ 표준 텍스트에 대한 참조도 도움이 될 것입니다. 감사!

답변

10

먼저 const T*은 변경할 수없는 일부 T에 대한 포인터임을 이해하십시오. 두 번째로 기억해야 할 것은 모든 멤버가 실제로 this->을 통해 액세스된다는 것입니다.

그래서 (§9.3.1) :

비 정적 멤버 함수는 const를, 휘발성 선언, 또는 휘발성 const를 할 수있다. 이러한 cququalifier는이 포인터의 유형에 영향을줍니다 (9.3.2).

그리고 그것은 (§9.3.2) 기능 : 비 정적 (9.3) 멤버 함수 본문에

키워드이 값의 주소가 아닌 좌변 발현은 함수가 불려가는 오브젝트 클래스 X의 멤버 함수에서 이것의 타입은 X *입니다. 멤버 함수가 const로 선언되면,이 타입은 const X *입니다. 멤버 함수가 volatile로 선언되면, 이것의 타입은 휘발성 X *입니다. 멤버 함수가 volatile로 선언되면, 이것의 타입은 const입니다. 휘발성 X *. 함수에 const

this 포인터 const T*한다. 그 예는 실패 이유

이은 다음과 같습니다 int& 변형에서, athis->a로, this 그래서 aconst int입니다 const T*이다 액세스 할 수 있습니다. 그리고 const int은 암시 적으로 int&으로 변환 될 수 없습니다. 다른 함수와 동일합니다. 함수가 클래스의 모든에 const 난다, 당신은 암시 적으로 const 멀리 캐스팅 할 수 const입니다 즉

.

0

Const 멤버 함수는 멤버 데이터를 변경하지 않더라도 const가 아닌 멤버 함수를 호출 할 수 없습니다. 포인터가 암묵적으로 멤버 함수에 전달되고 과부하 해결에서 역할을하기 때문에 때때로 동일한 함수의 const 및 non-const 버전을 모두 제공해야합니다.

관련 문제