|
Программирование >> Аргументация конструирования
= 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 {) .
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |