Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предположим, что в определении класса некоторые поля являются объектами других классов (композиция).
class Example{ //вспомогательный класс
Example(int i, float f){…}// конструктор
}
class Test{
char* ptr;
Example field; //определяем поле-объект класса Example
…
}
Чтобы создать объект класса Test, нужно выполнить его конструктор, в котором нужно инициализировать поле-объект field. А для этого нужно вызывать конструктор класса Example.
Так как у каждого объекта имеется свой собственный набор полей, определенных в классе, со своими значениями, то инициализация поля при его описании в классе невозможна. Поэтому для передачи инициализирующих значений конструктору, вызываемому для члена класса, используется специальный синтаксис.
Конструктор класса Test может быть определен следующим образом:
Test(int w, char *pt, float t): field(w,t) {
ptr=pt;
...}
Этот синтаксис похож на инициализацию константных полей, только значений может быть несколько, по числу аргументов конструктора вспомогательного класса.
После заголовка конструктора основного класса ставится двоеточие, указывается имя инициализируемого поля и заключенный в круглые скобки список инициализирующих значений (через запятую).
Очевидно, что при разрушении объекта класса Test, помимо деструктора этого класса также потребуется вызов и деструктора класса Example.
Замечание
Этот специальный синтаксис не исключает возможность обычной инициализации полей с помощью формирования присваивания значения объектного типа в теле конструктора основного класса.
ЗАДАНИЕ 3 (порядок вызова конструкторов и деструкторов)
Чтобы определить порядок вызова конструкторов и деструкторов, эти функции-члены классов выводят на экран сообщения о своем вызове.
Вопросы для контроля
1. В чем различие разделов private и public в описании класса?
2. В чем проблема использования константных полей и как она решается?
3. Когда при наличии перегружаемых функций может возникнуть конфликт?
4. Могут ли все аргументы функции иметь значения по умолчанию?
5. Какие особенности синтаксиса имеют конструкторы и деструкторы?
6. Как инициализируются поля-объекты?
7. Если в программе определены несколько объектов класса, причем часть на глобальном уровне, а часть внутри функции, то, в каком порядке будут вызываться конструкторы и деструкторы?