|
Программирование >> Аргументация конструирования
Однако, как уже отмечалось, вы можете обеспечить класс инициализирующей функцией, которая будет вызываться в процессе создания объекта. Поскольку эта функция является членом класса, она имеет доступ к защищенным членам. Такой способ инициализации продемонстрирован в приведенном ниже примере. class Student { public: void initO semesterHours = 0; gpa = 0.0; . . .остальные открытые члены. . . protected: int semesterHours; float gpa; void fn 0 { Student s; создаем объект ... s.init{); ... и инициализируем его .. .продолжение функции... Однако при таком подходе ответственность за инициализацию объекта снимается с класса. Другими словами, класс должен полагаться на то, что внешнее приложение вызовет функцию-член init (). В нротивном случае объект останется не проиниииа-лизированным и будет содержать непредсказуемые значения. Для того чтобы избежать этой неприятности, ответственность за вызов инициализирующей объект функции необходимо переложить с приложения на компилятор. Всякий раз при создании объекта компилятор может вставлять в код специальную инициализирующую функцию - а это и есть конструктор! Работа с конструкторами Конструктор ~ это специальная функция-член, которая автоматически вызывается во время создания объекта. Конструктор должен иметь то же имя, что и класс. (Таким образом компилятор сможет определить, что именно эта функция-член является конструктором. Конечно, создатели C++ могли сформулировать это правило как угодно, например, так: Конструктором является функция с именем Как именно определено правило, не имеет значения; глав- ное - чтобы конструктор мог быть распознан компилятором.) Еще одним свойством конструктора является то, что он не возвращает никакого значения, поскольку вызывается автоматически (если бы конструктор и возвращал значение, его все равно некуда было бы записать). Класс с использованием конструктора продемонстрирован в следующем примере: finclude <iostream.h> class public: Student() cout Конструируем объект Student\n ; semesterHours = 0; gpa = 0.0; ые открытые члены.. . protected: float gpa; void fn() Student s; создаем и инициализируем объект ... продолжение функции... В этом примере компилятор сам вызывает конструктор :: Student (] в том месте, где объявляется объект s. Этот простой конструктор реализован в виде встроенной (inline) функции. Конструктор можно создать и как обычную функцию с телом, вынесенным из объявления класса: ttinclude <iostream,h> class Student public: Student(); альные открытые члены.. . protected: float gpa; Student: : StudentO cout Конструируем StudentXn ; semesterHours = 0 ; gpa = 0.0; vcidfn (] Student s; создаем и инициализируем объект .. .продолжение функции.. . int char* f n () ; return 0; В данном примере добавлена небольшая функция чтобы эту тестовую программу можно было запустить. Настоятельно рекомендую пройти эту программу в пошаговом режиме отладчика перед тем, как двигаться дальше. Инструкции HO работе с отладчиком GNU С + + нриведены в главе 29, Десять способов избежать ошибок . Выполняя этот пример в пошаговом режиме, дойдите до строки с объявлением объекта s. Выполните команду отладчика Шаг с заходом в функции (Step into), и унрав-лепие как но волшебству перейдет к функции student:: Student () (если у вас inline-версия конструктора, убедитесь, что при компиляции включена опция Outline inline functions, с помощью которой тело функции выносится из объявления класса; в противном случае код конструктора будет подставлен в тело программы и вы не сможете попасть в конструктор). Продолжайте выполнение конструктора в пошаговом режиме. Когда функция закончится, управление перейдет к следующей за объявлением объекта класса строке. В одно окс может быть объявлена лько объектов. Выполните, например, о пошаговом режиме следующее: vcici /П [] Studeiit S [5]; создаем массив объектов ...продолжение функции.,. Вы увидите пять вызовов конструктора - по одному каждого элемента массива. В приведенной далее программе используются команды вывода сообщений, информирующие о вызове конструктора, на случай, если вы не можете (или не хотите) запустить отладчик. Эффект будет хотя и не столь впечатляющим, но от этого не менее убедительным. Конструктор может быть запущен только автоматически! Нельзя вызывать конструктор как обгчную функцию-член, а значит, и повторно инициализировать объект класса void fп () { Stccent s; создаем и инициализируем объект ..-продолжение функции... S . Stude.it О ; пытаемся реинициализировагь его, но комнилятор сообщит об ог;ибке Объявление конструктора не должно содержать тип возвращаемого значения - и даже тип void. Если класс имее -члепы, которые являются объектами другого класса, конструкторы для этих объектов также будут вызваны автоматически. Обратите внимание на следующий пример, в который добавлены команды вывода сообщений, позволяющие увидеть, в каком порядке создаются объекты: # induce <i03tream.il> class Student public : StuciencO { cout Конструируем Student\n ; semesterHours C; gpa = 0.0; стальные открытые члены.. . protected: int sejT.esterHour.s; float gpa; class teacher ( public: Tea ;her() { cout << Конструируем Teacher\n ; class 1jtor?air
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |