ShareVar::num = 100;

Здесь значение переменной num устанавливается независимо от объекта, а для обращения к ней достаточно использовать имя класса и оператор разрешения области видимости. Более того, эта инструкция законна даже до создания каких-либо объектов типа ShareVar! Таким образом, получить или установить значение static-члена класса можно до того, как будут созданы какие-либо объекты.

И хотя вы, возможно, пока не почувствовали необходимости в static-членах класса, по мере программирования на C++ вам придется столкнуться с ситуациями, когда они окажутся весьма полезными, позволив избежать применения глобальных переменных.

Можно также объявить статической и функцию-член, но это — нераспространенная практика. К статической функции-члену могут получить доступ только другие static-члены этого класса. (Конечно же, статическая функция-член может получать доступ к нестатическим глобальным данным и функциям.) Статическая функция-член не имеет указателя this. Создание виртуальных статических функций-членов не разрешено. Кроме того, их нельзя объявлять с модификаторами const или volatile. Статическую функцию-член можно вызвать для объекта ее класса или независимо от какого бы то ни было объекта, а для обращения к ней достаточно использовать имя класса и оператор разрешения области видимости.

Применение к функциям-членам модификаторов const и mutable

Константная (const-) функция-член не может модифицировать объект, который ее вызвал.

Функции-члены класса могут быть объявлены с использованием модификатора const. Это означает, что с указателем this в этом случае необходимо обращаться как с const-указателем. Другими словами, const-функция не может модифицировать объект, для которого она вызвана. Кроме того, const-объект не может вызвать не const-функцию-член. Но const-функцию-член могут вызывать как const-, так и не const-объекты.

Чтобы определить функцию как const-член класса, используйте формат, представленный в следующем примере.

class X {

  int some_var;

 public:

  int f1() const; // const-функция-член

};

Как видите, модификатор const располагается после объявления списка параметров функции.

Цель объявления функции как const-члена — не допустить модификацию объекта, который ее вызывает. Например, рассмотрим следующую программу.

/* Демонстрация использования const-функций-членов. Эта программа не скомпилируется.

*/

#include

using namespace std;

class Demo {

  int i;

 public:

  int geti() const {

   return i; // все в порядке

  }

  void seti (int x) const { i = x; // ошибка! }

};

int main()

{

 Demo ob;

 ob.seti(1900);

 cout << ob.geti();

 return 0;

}

Эта программа не скомпилируется, поскольку функция seti() объявлена как const-член. Это означает, что ей не разрешено модифицировать вызывающий объект. Ее попытка изменить содержимое переменной i приводит к возникновению ошибки. В отличие от функции seti(), функция geti() не пытается модифицировать переменную i, и потому она совершенно приемлема.

Возможны ситуации, когда нужно, чтобы const-функция могла изменить один или несколько членов класса, но никак не могла повлиять на остальные. Это можно реализовать с помощью модификатора mutable, который переопределяет атрибут функции const. Другими словами, mutable-член может быть модифицирован const-функцией-членом. Рассмотрим пример.

/* Демонстрация использования модификатора mutable.

*/

#include

using namespace std;

class Demo {

  mutable int i;

  int j;

 public:

  int geti() const {

   return i; // все в порядке

  }

  void seti(int x) const {

   i = x; // теперь все в порядке

  }

  /* Следующая функция не скомпилируется,

   void setj (int х) const {

    j = x; // Это по-прежнему неверно!

   }

  */

};

int main()

{

 Demo ob;

 ob.seti(1900);

 cout << ob.geti();

 return 0;

}

Здесь член i определен с использованием модификатора mutable, поэтому его можно изменить с помощью функции seti(). Однако переменная j не является mutable-членом, поэтому функции setj() не разрешено модифицировать его значение.

Использование explicit-конструкторов
Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги