Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы Осадчий А.В. гр.010902.docx
Скачиваний:
9
Добавлен:
24.04.2019
Размер:
143.34 Кб
Скачать

16. Понятие деструктора. Когда вызываются конструкторы и деструкторы.

Деструктор — специальный метод класса, служащий для деинициализации объекта (например освобождения памяти). Многие объекты могут распределять память для хранения информации; когда вы уничтожаете такой объект, C++ будет вызывать специальный деструктор, который может освобождать эту память, очищая ее после объекта.

Деструктор не имеет возвращаемого значения.

~class_name (void) //----------->указывает деструктор

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

  • Конструктор не имеет возвращаемого значения, но вы не указываете ему тип void. Вместо этого вы просто не указываете возвращаемое значение вообще.

  • Когда ваша программа создает объект, она может передать параметры конструктору во время объявления объекта.

  • C++ позволяет вам перегружать конструкторы и разрешает использовать значения по умолчанию для параметров.

  • Деструктор представляет собой специальную функцию, которую ваша программа вызывает автоматически каждый раз при уничтожении объекта. Деструктор имеет такое же имя, как и класс объекта, но его имя предваряется символом тильды (~).

17. Константные объекты и функции-члены.

Константный объект - неизменяемый объект. Его данные нельзя изменять, методы можно вызывать только константные. (Два исключения: (1)константный метод может менять mutable-члены, т. е. mutable-данные можно изменить косвенно, путём вызова константного метода; (2) можно изменять статические данные, если они сами не константные).  Константный объект инициализируется так:  Если объявлен как член класса, то в конструкторе  man::man (string n)  :name(n)  {  ....}  Если объявлен как статический член класса, то где угодно (в любой единице компиляции*), вне функций/процедур/классов и т. д., с указанием имени класса, без слова static  const double math::pi (3.1415926);  Если объявлен как глобальные данные, то примерно также  const double pi (3.1415926); 

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

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

К сожалению, многие функции-члены, которые ведут себя далеко не константно, проходят побитовый тест. В частности, функция-член, которая модифицирует то, на что указывает указатель, часто не ведет себя как константная. Но если объекту принадлежит только указатель, то функция формально является побитово константной, и компилятор не станет возражать. Это может привести к неожиданному поведению. Например, предположим, что есть класс подобный Text-Block, где данные хранятся в строках типа char * вместо string, поскольку это необходимо для передачи в функции, написанные на языке C, который не понимает, что такое объекты типа string.