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-конструкторов