Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_otvety_k_ekzamenu.doc
Скачиваний:
55
Добавлен:
13.04.2015
Размер:
786.94 Кб
Скачать

5. Конструкторы по умолчанию (default constructors). Тривиальные и нетривиальные сгенерированные конструкторы классов. Конструирование массивов объектов.

Конструктор, не принимающий ни одного явного аргумента, называется КОНСТРУКТОРОМ ПО УМОЛЧАНИЮ(default constructor). Такой конструктор определяют в явном виде для классов, для которых существует некоторый смысловой эквивалент нулевого значения.

ТРИВИАЛЬНЫЙ конструкторне предполагает выполнения каких-либо инициализирующих действий вообще. Такое поведение характерно для простых структур в стиле языка С либо подобных Point простейших С++ классов. Инициализация переменных встроенных типов является обязанностью (проблемой) программиста, а не компилятора. И если программист не написал собственного конструктора, большинство компиляторов проигнорируют генерацию и вызов такого тривиального конструктора по умолчанию в принципе (если делать по инициализации ничего не нужно, да и поскольку адрес конструктора взять нельзя, то зачем что-либо генерировать?).

Смысл НЕТРИВИАЛЬНЫХ сгенерированных автоматически конструкторовсостоит в обеспечении правил языка для случаев, когда в конструкторе должны неявно происходить дополнительные действия. Необходимость в нетривиальном конструкторе возникает, например, при использовании объектов классов в составе других классов. В таком случае при создании объекта класса верхнего уровня становится необходим вызов конструктора объекта нижнего уровня (поскольку имеется в наличии полезный инициализирующий код для выполнения).

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

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

6. Списки инициализации. Синтаксис, отличие от присвоений в теле конструктора, необходимость в существовании.

Для инициализации членов класса в языке С++ предусмотрена специальная альтернативная конструкция - СПИСКИ ИНИЦИАЛИЗАЦИИ.При определении конструктора сразу после аргументов, но до открытия тела ставится двоеточие, а затем через запятую перечисляются инициализаторы для переменных.

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

Для переменных встроенных типов выбор между размещением инициализаторов в списке или теле конструктора является стилистическим предпочтением.Никакого существенного влияния на результат компиляции это решение не оказывает. В то же время, существуют определенные ситуации, когда размещение инициализации в списке является единственно доступным способом для задания корректного начального состояния для переменной-члена, а помещение инициализирующего кода в тело конструктора не представляется возможным.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]