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

1 ... 53 54 55 [ 56 ] 57 58 59 ... 108


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

функция является членом класса, она имеет доступ к защищенным членам. Такой способ инициализации продемонстрирован в приведенном ниже примере.

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



1 ... 53 54 55 [ 56 ] 57 58 59 ... 108

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