Глава 15. Перегрузка функций_________________________________37?

Данный класс наглядно демонстрирует, что для использования преимуществ перегрузки не требуется никакой специальной нотации. Не столь очевидно, что помимо операции присваивания (которую компилятор определит и без нашего участия), здесь попутно введено несколько новых моментов.

Развернутая информация об операции присваивания приведена в главе 17 "Конструкторы: копирование и присваивание". Сейчас же мы обратим внимание на две другие особенности данного класса: встраиваемые функции и списки инициализации.

Встраиваемые функции класса. Встраиваемые функции были рассмотрены в главе 9 "Описатели и спецификаторы данных". В случае оформления функций как встраиваемых, компилятор вставляет в исполняемый код не вызов функции, а целиком ее тело.

Конструкторы и другие функции-члены класса, определенные непосредственно в классе, также являются встраиваемыми. Определение встраиваемой функции-члена прямо в классе не требует ключевого слова inline; по мнению создателя языка C++ Бьерна Страуструпа (Bjarne Stroustrop), в данном контексте это излишне. Но если вам кажется, что это сделает вашу программу понятнее, то не вставляйте спецификатор inline без всяких сомнений. Встраиваемые функции были подробно разобраны в главе 9.

Список инициализации. Назначение конструктора состоит в обеспечении надлежащей инициализации каждого объекта. Частью этого процесса является инициализация членов класса, которая обычно состоит в присваивании каждому члену класса определенных значений. Рассмотрим присваивание начальных значений на примере класса, содержащего несколько простых типов данных (см. листинг 15.3).

h03711.jpg

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);