Хоть и не обязательно делать это, вполне допустимо указать ключевое слово inline
и в объявлении, и в определении. Однако указание ключевого слова inline
в определении только вне класса может облегчить чтение класса.
Подобно функциям, которые не являются членами класса, функции-члены могут быть перегружены (см. раздел 6.4), если они отличаются количеством и/или типами параметров. При вызове функции-члена используется тот же процесс подбора функции (см. раздел 6.4), что и у функций, не являющихся членом класса.
Например, в классе Screen
определены две версии функции get()
. Одна версия возвращает символ, обозначенный в настоящее время курсором; другая возвращает символ в указанной позиции, определенной ее рядом и столбцом. Чтобы определить применяемую версию, компилятор использует количество аргументов:
Screen myscreen;
char ch = myscreen.get(); //
ch = myscreen.get(0,0); //
Иногда (но не очень часто) у класса есть переменная-член, которую следует сделать изменяемой даже в константной функции-члене. Для обозначения таких членов в их объявление включают ключевое слово mutable
.
Screen
изменяемую переменную-член access_ctr
, используемую для отслеживания частоты вызова каждой функции-члена класса Screen
:
class Screen {
public:
void some_member() const;
private:
mutable size_t access_ctr; //
//
//
};
void Screen::some_member() const {
++access_ctr; //
//
}
Несмотря на то что функция-член some_member()
константная, она может изменить значение переменной-члена access_сtr
. Этот член класса является изменяемым, поэтому любая функция-член, включая константные, может изменить это значение.
Screen
, определим также класс диспетчера окон, который представляет коллекцию окон на данном экране. У этого класса будет вектор объектов класса Screen
, каждый элемент которого представляет отдельное окно. По умолчанию класс Window_mgr
должен изначально содержать один объект класса Screen
, инициализированный значением по умолчанию. По новому стандарту наилучшим способом определения такого значения по умолчанию является внутриклассовый инициализатор (см. раздел 2.6.1):
class Window_mgr {
private:
//
//
std::vector
};
При инициализации переменных-членов типа класса их конструктору следует предоставить аргументы. В этом случае применяется список инициализации переменной-члена типа vector
(см. раздел 3.3.1) с инициализатором для одного элемента. Этот инициализатор содержит значение типа Screen
, передаваемое конструктору vector
для создания вектора с одним элементом. Это значение создается конструктором класса Screen
, получающим параметры в виде двух размерностей и заполняющего символа, чтобы создать пустое окно заданного размера.
Как уже упоминалось, для внутриклассовой инициализации может использоваться форма инициализации =
(как при инициализации переменных-членов класса Screen
) или прямая форма инициализации с использованием фигурных скобок (как у вектора screens
).
=
или в фигурных скобках.
Упражнение 7.23. Напишите собственную версию класса Screen
.
Упражнение 7.24. Добавьте в свой класс Screen
три конструктора: стандартный; получающий высоту, ширину и заполняющий содержимое соответствующим количеством пробелов; получающий высоту, ширину и заполняющий символ для содержимого экрана.