2013-04-19 6 views
1

X을 회원 함수 f() 인 클래스로 지정하십시오."this"포인터가 항상 const입니까?

thisf()의 암시적인 인수이며, 형식은 X* const입니다.

그런 다음 f() const이 const 멤버 함수 인 경우 this 포인터의 형식은 이제 const X* const입니다.

두 경우 모두 포인터는 const입니다. 그렇다면 함수 f() 정의 내에서 X의 데이터 멤버를 수정하는 것이 허용되는 이유는 무엇입니까? 우리는 항상 f() const가 CONST 인 경우, 다음이 할 수있는 방법입니다

void X::f() {   
     const_cast <int&> (member) = 1;  
} 

같이 const_cast에 의지 안 :

void X::f() const{   
     const_cast <int&> (member) = 1;  
} 

(또는 당신은 또한 수 있습니다 구성원 변경 가능)

그러나 이것이 작동하는 이유는 무엇입니까

void X::f() { 
     member = 1;  
} 
+0

그리고 C++의 초창기에 다시 ** 것들을 혼란스럽게 만들 수있었습니다 ** 수정 'this'; 이것은 객체를 메모리의 특정 영역에 배치하는 메커니즘으로, 이제는 'new'라는 배치로 대체되었습니다. –

답변

0

이 포인터는 rvalue입니다. 이 포인터는 const 포인터가 아니어도 값을 할당 할 수 없습니다.

f()이 비 const 멤버 함수 인 경우이 포인터는 비 const X을 가리키므로 X의 데이터 멤버를 수정할 수 있습니다.

그러나 f() const이 const 멤버 함수 인 경우이 포인터는 const const X을 가리키고 있으므로 X의 데이터 멤버를 수정할 수 없습니다. 그런 다음 데이터 멤버를 변경 가능하게 만들거나 f() const 정의 내에서 수정하려는 경우 const_cast가 필요합니다. member는 const가 아닌의 INT에 대한 참조를 경우

우리는에 const_cast를 들어,

void X::f() const{   
     const_cast <int&> (member) = 1;  
} 

을 할 수있는, 다음 할당은 컴파일러에 의해 받아 들여 행동을 원했다. member이 const int를 참조하면 동작을 예측할 수 없습니다. 다음을 비교하십시오 :

const int a = 10; 
const int* b = &a; 
int* c = const_cast<int*>(b); 
// *c = 20; 

c는 pointee가 const 인 const int *의 const_cast입니다. 행동은 정의되지 않았습니다.

int a1 = 10; 
const int* b1 = &a1; 
int* c1 = const_cast<int*>(b1); 
*c1 = 20; 

c1은 point_a가 const 인 const int *의 const_cast입니다. 이 작업은 c1이 가리키는 int에 새로운 값을 자유롭게 할당 할 수 있습니다.

const 멤버 함수는 데이터 멤버의 값을 변경할 수 없다는 것이 알려져 있습니다. 우리가 말하는 것은 이것이 그때의 포인터의 pointee가 const이기 때문입니다.

3

this는 유형 X* const이며, f()에 대한 암시 인수입니다.

없음 매우하지만,이 질문의 이익을 위해 충분히 가까이 (이것은 실제로 를 rvalue 유형 X*이다).

두 경우 모두이 포인터의 유형이 const 인 것으로 보입니다. 그렇다면 왜 함수 f() 정의 내에서 클래스 X의 데이터 멤버를 수정할 수 있습니까? 포인터이 (X* const 같이) const 경우, 당신은 포인터을 변경할 수 없기 때문에

. 그것이 무엇이든 변경할 수 있습니다. const-to-const 인 경우 (const X*에서와 같이) 포인터가 가리키는 포인터를 변경할 수 없습니다.

따라서 this은 수정할 수 없습니다. this = &some_other_object을 쓸 수 없습니다. const 멤버 함수에서는 없이 *this의 (변경 불가능한) 멤버를 수정할 수 없습니다.