4 ответов:
это правило, вот и все. И не зря.
The
constквалификатор для функции-члена означает, что вы не можете изменить non-mutableнеstaticпеременные-члены класса.в качестве предложения некоторой рационализации,
thisуказатель вconstквалифицированная функция-член являетсяconstтип, иthisпо своей сути относится к экземпляр класса.staticчлены не связаны с экземпляром класса. Вам не нужно экземпляр для измененияstaticчлен: Вы можете сделать это, в вашем случае, написавA::a = 10;.Итак, в вашем первом случае подумайте о
a = 10;как сокращение дляA::a = 10;и во втором случае, думаю, что это сокращение дляthis->a = 10;, который не компилируется с типаthis- этоconst A*.
согласно стандарту C++ (9.2.3.2 статические элементы данных)
1 статический элемент данных не является частью подобъектов класса...
и (9.2.2.1 this указатель)
1 в теле нестатической функции-члена (9.2.1) ключевое слово это выражение prvalue, значение которого является адресом объекта для которого вызывается функция. Тип этого в члене функция класс X - это X*. если функция-член объявлена const, тип этого-const X*,...
и наконец (9.2.2 нестатические функции-члены)
3 ... если поиск имени (3.4) разрешает имя в id-выражении до a не-static non-типа член некоторого класса C, и если id-выражение потенциально оценивается или C является X или базовым классом X, id-выражение преобразуется в выражение доступа к члену класса (5.2.5) с помощью (*это) (9.2.2.1) в качестве постфиксного выражения для слева от него . оператор.
таким образом, в этом определении класса
class A { public: static int a; void set() const { a = 10; } };статический элемент данных
aне является подобъектом объекта типа класса и указателемthisне используется для доступа к статическим членам данных. Таким образом, любая функция-член, нестатическая постоянная или непостоянная, или статическая функция-член может изменить элемент данных, потому что он не является постоянный.в этом определении класса
class A { public: int a; void set() const { a = 10; } };нестатический элемент данных
aявляется подобъектом объекта типа класса. Для доступа к нему в функции-члене используется либо синтаксис доступа к члену этого синтаксиса подразумевается. Вы не можете использовать постоянный указательthisдля изменения элемента данных. И указатель это действительно имеет типconst A *функцииsetпотому что функция объявлена с квалификаторомconst. Если функция не имеет квалификатора в этом случае элемент данных может быть изменен.
дело в том, что если функция-член класса
Aиconst, потом типаthisиconst X*, и тем самым предотвращает изменение нестатических элементов данных (cf, например,стандарт C++):9.3.2 этот указатель [класс.это]
в теле нестатической функции-члена (9.3) ключевое слово this является выражением prvalue, которое значение-это адрес объекта, для которого вызывается функция. Тип this в функции-члене класса X является Х*. Если функция-член объявляется const, тип этого-const X*,...
если
aявляется нестатическим членом данных, тоa=10это то же самое, чтоthis->a = 10, что не допускается, если типаthisиconst A*иaне был объявлен какmutable. Таким образом, посколькуvoid set() constделает типаthisбудучиconst A*этот доступ не разрешен.если
a- это статические данные член, напротив, тогдаa=10не предполагаетthisвообще; и покаstatic int aсам по себе не был объявлен какconst, заявлениемa=10разрешено.
The
constквалификатор на функции-члена означает, что вы не можете изменитьnon-mutable,non-staticчлены данных класса.
Comments