2013-04-19 2 views
2

Для функции non const-члена класса X этот указатель имеет тип X * const.C++ этот указатель всегда const

Тогда этот указатель для функции-члена всегда является константой.

Тогда мы всегда должны Const брошено как в:

void foo::p() {       
     const_cast <int&> (member) = 1;  
} 

Я пропускаю что-то здесь?

+0

вы объявили 'р()' как константы, так что вы не можете изменить член класса –

+0

@Koushik, вы можете, но вы должны пометить эти элементы как 'mutable' – izogfif

+0

@izogfif. да, а он?о котором я говорю. –

ответ

4

Для функции не const-член класса X этот указатель имеет тип X * const.

Нет, тип this указателя внутри неконстантного функции члена просто (и это Rvalue). Но даже если this были X* const, это все равно не помешало бы вам изменять члены данных.

Ваш пример кода не соответствует вашему вопросу. Он показывает функцию-член const. Внутри функции const-члена тип this равен const X*. Вы не можете изменять какие-либо элементы данных внутри функции-члена const (за исключением членов данных, объявленных как mutable). Это противоречит объявлению функции-члена как const, если ваша цель - изменить данные. Прими решение.

+0

'этот указатель имеет тип X * const', то это указатель на указатель типа X, правильно? это указатель на const? – 2013-04-19 10:13:36

+0

см. Мои правки, я перефразировал пример – 2013-04-19 10:14:28

+0

'this' не является указателем const, но это значение rvalue, поэтому не стоит думать о' this' как указателе const; вы не можете переназначить «это» в любом случае. – fredoverflow

1

Для функции не const-член класса X этот указатель имеет тип X * const.

Тогда этот указатель для функции-члена всегда является константой.

Более или менее, что это Rvalue, но может рассматриваться как константный указатель, но внимание: указатель является Const, но не pointee. Это означает, что вы не можете изменить объект, на который это указывает, но вы можете изменить содержимое объекта.

В вашем примере, функция объявлена ​​Const:

void foo::p() const { 
       // ^---- here! 

Таким образом, в этом случае, this имеет тип X const * const (это точно Rvalue типа X const*, но это не имеет значения здесь) - то есть указатель и указатель - const. Последнее действительно имеет значение.

Так что, если вы хотите изменить членов, просто не использовать сопзЬ для метода:

void foo::p() {  
      //^------ no const! 
     member = 1;  // perfectly legal, because *this is not const 
     this->member = 1; // the same 
     this = new foo; // still illegal, this cannot be assigned to 
} 
+0

'this' сам по себе никогда не const, но я думаю, что это не вредно притворяться. – fredoverflow

+0

изменил это, спасибо :) –

0

сопзЬ после символа звезды, что означает «Х * сопз», а не «Const X * или X const * "(которые являются одинаковыми). , поэтому это означает, что вы не можете сделать «эту» точку для другого объекта, чем тот, на который он указывает, но вы можете изменить объект, который указывает, что имеет смысл. «const X * или X const *» означает, что вы не можете изменить объект, который указывает на данный момент, но вы можете сделать точку указателя на разные объекты. надеется, что это помогает (:.

Смежные вопросы