Страница 8 из 25 Конструктор и перегруженные функции
Использование функцийа тип s e t _ d a t e для инициализации объектов класса не элегантно и чревато ошибками. Так как нигде не утверждается, что объект должен быть инициализирован; программист может забыть сделать это или часто с равно плачевным результатом, сделать это дважды. Лучший подход состоита в том, чтобы позволить программисту объявить функцию явно предназначенную для инициализации объекта. Так как такая функция конструирует значения данного типа, он называется конструктором данного класса и опознается в языке благодаря тому, что имеет то же имя, что и сам класс. Например: class date { . . . date (int, int, int); }; Если класс имеет конструктор, все объекты этого класса должны быть инициализированы: date today = date (23, 6, 1983); date xmas (25, 12, 0); /* правильная сокращенная форма */ date jily4 = today; date my_birthday;/* неправильно, отсутствует инициализация */ Часто желательно предоставить несколько способов инициализации объектов класса. Это можно сделать путем предоставления нескольких конструкторов. Например: class date { . . . date (int, int, int); /* день месяц год */ date (char*); /* дата в символьном виде */ date (int); /* день,месяц и год подразумеваются текущими */ date (); /* умолчание: сегодня */ }; Поскольку функции-конструкторы различаются типами своих аргументов, компилятора в каждом случае в состоянии выбрать правильную функцию: date today (4); date july4 ("July 4, 1983"); date guy ("5 Nov"); date now; /* инициализация по умолчанию */ Применение конструкторов не ограничивается инициализацией они могут быть использованы везде, где необходимо иметь объект данного класса: date us_date (int month, int day, int year) { return date (day, month, year); } . . . some_function (us_date (12, 24, 1983)); some_function ( date (24, 12, 1983)); Если несколько функций объявлены с одинаковым именем говорятб что это имя перегруженою Использование перегруженных имен функций не ограничивается случаем конструкторов. Однако для несоставляющих функций их описания должны предваряться указанием, что имя будет перегружено, например: overload print; void print (int); void print (char*); или, возможно, сокращенно: overload void print (int), print (char*); С точки зрения компилятора, единственная вещь, общая для множества функций с одним именнем говорятб что это имя перегруженою Использование перегруженных имен функций не ограничивается случаем конструкторов. Однако для несоставляющих функций их описания должны предваряться указанием, что имя будет перегружено, например: overload print; void print (int); void print (char*); или, возможно, сокращенно: overload void print (int), print (char*); С точки зрения компилятора, единственная вещь, общая для множества функций с одним именмер, вышеприведенное описание простого конструктора для класса d a t e. Для аргументов функции с перегруженными именами правила преобразования типов язык С применяются не полностью. Преобразования, которые могут исказить информацию, не d o u b l e. Возможно, однако, предусмотреть разные функции для целого и вещественного типов. Например: overlood print (int), print (double); Список функций с перегруженным именем будет просматриваться по порядку до появления совпадения, таким образом p ri n t (l) будет вызывать функцию p r i n t для целого типа аргумента, а p r i n t (l,0) - для функции p r i n t с плавающей точкой. Если же порядок описаний будет изменен, оба обращения к функции вызовут функцию p r i n t с плавающей точкой с вещественным (d o u b l t) представлением аргумента l. |