Программирование >>  Аргументация конструирования 

1 ... 55 56 57 [ 58 ] 59 60 61 ... 108


Аргументация конструирования

В э/ной главе...

Как снабдить конструктор аргументами Перегрузка конструктора

Определение конструкторов по умолчанию V Конструирование членов класса У Управление последовательностью конструирования

ласе нредставляет тин объекта в реальном мире. Панример, мы иснользовали в класс Student для нредставления студента и его свойств.

Точно так же, как и студенты, классы считают себя абсолютно самостоятельными. Однако, в отличие от студентов, класс действительно сам ухаживает за собой - он

должен все время поддерживать себя в приемлемом состоянии. Например, отрицательный идентификационный номер студента не приемлем для объекта класса student. И только сам класс отвечает за то, что на этапе создания объекта номер инициализирован подходящим значением.

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

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

afuifMeHMoMU

C++ позволяет программисту определить конструктор с аргументами, например: iinclude <lostream.h> #include <string.h>

class Student

public:

Student(char *pName)

cout Конструируем студента pName \n ; strncpy(name, pName, sizeof(name)); name[sizeof(name) 1] = \0;

стальные открытые члены...

protected:

char name(40];

int semesterHours;

float gpa;

}- -

Та 18. Аргументация конструирования 185



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

Возможность добавления аргументов к конструктору не требует особой, простите за

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

инициализацию, специфичную для данного объекта. Конструктор, поддерживающий

аргументы, похож на магазин при автозаправке: он предоставляет полный сервис.

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

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

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

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

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

tinclude <io3tream.h> finclude <strina.h>

class Student

public:

Student (char pName)

cout Конструируем студента рЫаше \n ; strncpy(name, pNarrLe, sizeof(name) ) ; name[sizeof(name) - 1] = \0; semesterHours = 0; gpa = 0.0;

-Student()

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

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

а.пьные открытые члены.. . protected:

char name[40];

int semesterHours;

float gpa;




in (int argcs, char* pArgs [ ] ) {

Student sCDanny ) ; Создаем Дэкни return 0;

) a теперь избавимся от него

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

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

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

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

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

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

#include <iostream.h> Iinclude <string.h>

class Student

public:

Student(char *pName) -Student 0

. . -остальные открытые члены. . . protected:

char name[40];

int semesterHours ;

float gpa;

определим функции (обратите внимание на отсутствие типа возвращаемого значения) Student::Student(char *pName) {

cout Конструируем студента pName \n ; strncpy(name, pName, sizeof(name)); name[sizeof(name) - 1] = \0; semesterHours = 0;

gpa :=0.0;

обратите внимание, как выглядит деструктор Student::-Student()

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

Когда вы поднакопите побольше опыта в C++, то будете легко переводить функции из одной формы записи в другую.



1 ... 55 56 57 [ 58 ] 59 60 61 ... 108

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика