Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Глава 18. Аргументация конструирования 185. Возможность добавления аргументов к конструктору не требует особой




Зачем конструкторам нужны аргументы

Возможность добавления аргументов к конструктору не требует особой, простите за каламбур, аргументации, но я все же приведу несколько аргументов в пользу примене- ния аргументов. Во-первых, их использование в конструкторе достаточно удобно. Было бы несколько непоследовательно требовать от  программиста                                  конструировать объект, а затем вызывать инициализирующую функцию  с                                                                    чтобы она проводила инициализацию, специфичную для данного объекта. Конструктор, поддерживающий аргументы, похож на магазин при автозаправке: он предоставляет полный сервис.

Другая, более важная причина использования аргументов в конструкторе состоит в том, что иногда это единственный способ создать объект с необходимыми началь- ными  значениями.  что работа конструктора заключается в создании кор- ректного (в смысле требований данного класса) объекта. Если какой-то созданный по умолчанию объект не отвечает требованиям программы, значит, конструктор не вы- полняет свою работу.

Например, банковский счет без номера не является приемлемым (C++ все равно, каков номер счета, но это почему-то волнует банк). Можно создать объект

count без номера, а затем потребовать от приложения вызвать некоторую функцию- член для инициализации номера счета перед использованием. Однако это нарушает наши правила, поскольку при таком подходе класс вынужден полагаться на то, что эти действия будут выполнены внешним приложением.

 

Как использовать конструктор с аргументами

Идея использования аргументов проста. Как известно, функции-члены могут иметь аргументы, поэтому конструктор, будучи   тоже может иметь аргументы.

При этом нельзя забывать, что вы вызываете конструктор не как нормальную функцию и  передать  ему можно только в момент создания объекта. Так, приведенная ниже программа создает объект s класса student , вызывая конструктор Student ). Объект s уничтожается в момент возврата из функции main ().

 

class Student

{

 

{

cout << "Конструируем студента " <<    << "\n";

(name,  pNarrLe,                      (name) ) ;

— =

= 0;

gpa = 0.0;

}

 

{

cout << "Ликвидируем " << name << "\n";

 

// неплохо бы стереть имя уничтожаемого студента, name[0] '\0';

 

//         открытые члены... protected:

char

float gpa;

 

186                                  Часть ///.                                                 программирование


int                     argcs, char*

{

Student                    // Создаем Дэкни retur n 0;

)                                                    / / а теперь избавимся от

В этом примере конструктор выглядит почти так же, как и конструктор из гла- вы 17, "Создание и удаление объектов: конструктор и деструктор", с тем лишь отли- чием, что он принимает  аргумент   имеющий тип char*. Этот конструктор инициализирует все данные-члены нулевыми значениями, за исключением члена name, который инициализируется строкой

Объект s создается в функции main (). Аргумент, передаваемый конструктору, на- ходится в строке объявления s сразу же за именем объекта. Благодаря такому объяв- лению студент s получил имя Danny. Закрывающая фигурная скобка функции main() вызывает гром и молнию деструктора на голову несчастного Danny.

Запуск этой программы выведет на экран следующее:

Конструируем студента Danny Ликвидируем Danny

 

Многие конструкторы в этой главе нарушают правило "функции размером более трех строк не должны быть inline-функциями". Я просто решил об- легчить вам чтение (а теперь — ваши аплодисменты!).

 

Конструкторы и деструкторы могут быть реализованы также следующим образом:

 

<string.h> class Student

{

 


()

protected:

char


 

открытые члены...


int           ;

 

 

определим функции (обратите внимание на

// отсутствие типа возвращаемого значения)

*pName)

{

cout << "Конструируем студента " «    << "\n"; pName,

— =

gpa =0.0 ;

}

//обратите внимание, как выглядит деструктор

 

cout << "Ликвидируем " << name << "\n";

}

Когда вы поднакопите побольше опыта в C++, то будете легко переводить функ-

ции из одной формы записи в другую.


Поделиться:



Последнее изменение этой страницы: 2019-04-19; Просмотров: 181; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.017 с.)
Главная | Случайная страница | Обратная связь