Для функции не 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
}
вы объявили 'р()' как константы, так что вы не можете изменить член класса –
@Koushik, вы можете, но вы должны пометить эти элементы как 'mutable' – izogfif
@izogfif. да, а он?о котором я говорю. –