Глава 15. Перегрузка функций_________________________________37?
Данный класс наглядно демонстрирует, что для использования преимуществ перегрузки не требуется никакой специальной нотации. Не столь очевидно, что помимо операции присваивания (которую компилятор определит и без нашего участия), здесь попутно введено несколько новых моментов.
Развернутая информация об операции присваивания приведена в главе 17 "Конструкторы: копирование и присваивание". Сейчас же мы обратим внимание на две другие особенности данного класса: встраиваемые функции и списки инициализации.
Встраиваемые функции класса. Встраиваемые функции были рассмотрены в главе 9 "Описатели и спецификаторы данных". В случае оформления функций как встраиваемых, компилятор вставляет в исполняемый код не вызов функции, а целиком ее тело.
Конструкторы и другие функции-члены класса, определенные непосредственно в классе, также являются встраиваемыми. Определение встраиваемой функции-члена прямо в классе не требует ключевого слова inline; по мнению создателя языка C++ Бьерна Страуструпа (Bjarne Stroustrop), в данном контексте это излишне. Но если вам кажется, что это сделает вашу программу понятнее, то не вставляйте спецификатор inline без всяких сомнений. Встраиваемые функции были подробно разобраны в главе 9.
Список инициализации. Назначение конструктора состоит в обеспечении надлежащей инициализации каждого объекта. Частью этого процесса является инициализация членов класса, которая обычно состоит в присваивании каждому члену класса определенных значений. Рассмотрим присваивание начальных значений на примере класса, содержащего несколько простых типов данных (см. листинг 15.3).
1 Class SNAFU
2 (
3 public:
4 SNAFU ( int n = 0, char* str = "Hello"); // конструктор
5 // ... другие члены класса
6 private:
7 int num;
8 char* name;
9 };
10 // конструктор НЕ определен как встраиваемый
// просто для демонстрации присваивания членов
11 SNAFU::SNAFU ( int n, char* str)
12 { num = n;
13 int 1 = strlen (str) +1; // длина строки плюс место для '\0'
14 name = new char [1]; // выделение памяти для строки
15 if ( name != 0) // new возвращает 0 в случае ошибки
16 strcpy (name, str);