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

1 ... 58 59 60 [ 61 ] 62 63 64 ... 108


= no int =

cout Создаем студента рЫагае \п ; strncpy(name, pName, sizeof(name));

protected:

char name[40]; Studentid id;

Обратите особое внимание на первую строку конструктора. В этой строке есть кое-что, с чем вы до этого не встречались. Следующая за двоеточием команда вызывает конструкторы членов данного класса. Компилятор C++ прочтет эту строку так: Вызвать конструктор для члена id с аргументом ssld. Все остальные данные-члены, не вызванные явно, строить с использованием конструктора по умолчанию .

Результат работы этой программы свидетельствует, что все получилось так, как мы и хотели.

Присваиваем студенту id, равный 1234 Создаем студента Randy Сообщение из main

Удаляем студента 1234

Символ : можно использовать и для присвоения значений константам или членам ссылочного типа. Это можно сделать так, как показано в приведенном ниже примере.

class SillyClass

public:

SillyClass (intb i) : ten(10), refni)

protected:

const int ten; inti, refl;

int main(int argcs, char* pArgs[])

int i;

SillyClass sc (i); return 0;

В момент входа в тело конструктора SillyClass данные-члены ten fi уже

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

и другим способом их инициализации в классе вам добиться не удастся. не попадитесь в ловушку

Еще раз взгляните на объявление объектов класса Student из нриведенного выще примера:

StudentnoName; w.i

Student freshManC Smell E. Eish ) ;

Student xfer( UppR. .Classman , 80, 2.5); Жу:-

Все : объекты типа Student, за исключением noName; объявленысо скобками, в которых находятся передаваемые классу аргументы. Почему же объект noName объ-

Г явлен без скобок? у .:



С точки зрения приверженцев последовательности и аккуратности, лучше б1ло бы

объявлять этот объект так:

; Student noName();

Конечно, можно сделать и так, но это не приведет к ожидаемому результату. Вме- i сто объявления объекта noName, создаваемого с помощью конструктора по умод- \

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

объект класса student. Мистика!

Приведенные ниже два объявления демонстрируют, как похожи объявления объек-

i та и функции в формате С + + . (Я-то считаю, что это можно было сделать и по, другому, но кто будет со мной считаться?..) Единственное отличие заключается

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

Student thislsAFunc(int);

Student thisIsAnObject (10) ; . .

. Если скобки пусты, невозможно однозначно сказать, что объявляется - функ-;; ция иди объект. Для обеспечения совместимости с С в С+ + . считается, что объявление с пустыми скобками является объявлением функции (более надежной

. альтернативой было бы требование наличия ключевого слова void при объявле-; НИИ функции, но тогда нарушалось бы условие совместимости с существующими программами на С...).

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

Порядок создания объектов подчиняется перечисленным ниже правилам.

Локальные и статические объекты создаются в том порядке, в котором они объявлены в программе.

/ Статические объекты создаются только один раз. / Все глобальные объекты создаются до вызова функции main(). : V Нет какого-либо определенного порядка создания глобальных объектов. / Члены создаются в том порядке, в котором они объявлены внутри класса.

Деструкторы вызываются в порядке, обратном порядку вызова конструкторов.

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

Рассмотрим каждое из приведенных выше правил.




Локальные объекты создаются последовательно

Локальные объекты создаются в том порядке, Б котором в программе встречаются их объявления- Обычно это порядок появления кода объявлений в функции. (Если, конечно, в функции нет безусловных переходов, перепрыгивающих через объявле

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

Статические объекты создаются один раз

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

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

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

class DoNothing

public:

DoNothing (int initial)

cout << Переменная thing создана со значением

<< initial

<< \n ;

void i)

static DoNothing dn(i) ;

cout Мы - в функции fn с i = i \n ;

indnt argcs, char* pArgs [ ] ) {

fn(lO); fn(20);

return 0;

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

Переменная DoNothing создана со значением

Мы - в функции fn с i = 10 Мы - в функции fп с 1 = 2 О

Обратите внимание, что сообщение от функции fn (} появилось дважды, а сообщение от конструктора DoNothing - только при первом вызове fn ().

Все глобальные объекте! создаются amain ()

Все глобальные объекты входят в область видимости аммы. Таким образом, все они конструируются до того, как управление передается функции main {) .



1 ... 58 59 60 [ 61 ] 62 63 64 ... 108

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