Почему функция-член const может изменять статический элемент данных?



в следующем C++ программа, модифицирующая a статический элемент данных С работает:



class A 
{
public:
static int a; // static data member

void set() const
{
a = 10;
}
};


но изменение a нестатический член данных С

633   4  

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

    Ничего не найдено.