
- •Лекция №4 указатель this. Инлайн-функции. Константные и статические данные и функции. Указатель this
- •Встраиваемые (inline) функции
- •Файл Dot.H
- •Статические данные-члены класса
- •Файл Dot.H
- •Файл Dot.Cpp
- •Файл Main.Cpp
- •В памяти существует 3 объекта типа Dot
- •Статические функции-члены класса
- •Константные данные-члены класса
- •Константные функции-члены класса
- •Константные объекты
В памяти существует 3 объекта типа Dot
Корректный учёт количества существующих объектов достигается двумя действиями: каждый конструктор, (в том числе и конструктор копирования) увеличивает счётчик на единицу, деструктор – уменьшает на единицу. Поскольку конструктор вызывается при создании каждого объекта, а деструктор – при уничтожении, то данное-член count будет содержать количество существующих объектов независимо от того каким образом и в какой области определения создан или уничтожен объект.
Статические функции-члены класса
Особенностью использования статических функций-членов является то, что они также определены в единственном экземпляре и не являются безраздельной собственностью какого-то представителя класса. В связи с этим им не передается указатель this. Эта особенность статических функций-членов используется при написании функций-обработчиков прерываний и callback-функций (при программировании для Windows).
Из сказанного выше вытекает несколько важных следствий:
статическая функция-член может вызываться независимо от того, существует или нет какой-либо представитель класса;
статическая функция-член может манипулировать только статическими данными-членами класса и вызывать только другие статические функции-члены класса;
статическая функция-член не может быть объявлена с модификатором virtual.
Константные данные-члены класса
Данное-член класса может быть объявлен с модификатором const, который указывают перед типом константного данного. Ключевое слово const информирует компилятор, что значение данного элемента объекта не должно изменяться после инициализации. Константные данные-члены класса нельзя инициализировать в конструкторе обычным образом. Список инициализации является единственным методом инициализации данных-констант. Приведем пример объявления константного данного и его инициализации:
class Dot // класс точки
{
const char name; // имя точки – константное данное-член
double x, y; // координаты точки
public: // открытые члены класса
Dot(char Name, double X, double Y): name(Name), x(X), y(Y) {}
Dot(char Name): name(Name), x(0), y(0) {}
};
Константные функции-члены класса
Функция-член класса может быть объявлена с модификатором const, который следует за списком параметров. Такая функция не может изменять значение данных-членов класса и не может вызывать не константные функции-члены класса. Приведем пример объявления константной функции-члена класса:
class Coord // базовый класс координат
{
double x, y; // координаты
public: // открытые члены класса
Coord() {x=0; y=0;} // инициализирует координаты нулями
double GetX() const {return x;}// константная функция возвращает координату x
double GetY() const {return y;}// константная функция возвращает координату y
void SetX(double X) {x=X;} // передаёт заданное значение в координату x
void SetY(double Y) {y=Y;} // передаёт заданное значение в координату y
};
Константные объекты
Можно также создавать константные объекты. Для этого их объявления предваряют модификатором const. Например,
const Coord A(3, 5);
Ключевое слово const информирует компилятор, что состояние данного объекта не должно изменяться. В связи с этим компилятор генерирует сообщение об ошибке, если для константного объекта вызывается функция-член (которая может изменить его данные-члены, изменив тем самым его состояние). Исключением из этого правила являются константные функции-члены, которые в силу своего определения не изменяют состояние объекта.