Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_ekzamen_CPP.doc
Скачиваний:
3
Добавлен:
21.09.2019
Размер:
311.81 Кб
Скачать
  1. Явные конструкторы.

Конструктор может вызываться явно в 2-х случаях:

  1. в списке инициализаций;

  2. в выражении;

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

Конструктор с одним параметром рассматривается компилятором как определённый пользователем оператор преобразования типов. Т.е. компилятор может использовать этот конструктор для неявного преобразования типов в выражении. Чтобы запретить такое использование конструктора с одним параметром, этот конструктор объявляется как явный при помощи ключевого слова explicit.

  1. Деструкторы.

Деструктор – функция-член класса, имя которой начинается с символа «~», за которым без пробелов следует имя класса. Деструктор предназначен, для освобождения ресурсов, захваченных во время жизни объекта (память). Если ресурсы освобождать не нужно, то деструктор не пишется. В этом случае компилятор генерирует деструктор по умолчанию.

Деструктор должен удовлетворять следующим требования

  1. деструктор всегда может быть только 1;

  2. деструктор не может иметь аргументов;

  3. деструктор не может возвращать значения;

  4. деструктор не может быть объявлен с квалификаторами const или volatile;

  5. деструктор не может быть объявлен со спецификатором static.

Деструкторы вызываются неявно в следующих случаях:

  1. для static-объектов при завершении программы;

  2. для локальных объектов при выходе из блока, в котором эти объекты определены;

  3. при применении оператора delete к указателю на объект.

Пример построения класса в дроби:

Программа, содержащая класс выглядит следующим образом: она содержит 3 файла. 1-м идёт заголовочный файл с расширением h, в котором находится интерфейс класса. Далее имеется файл с расширением cpp, содержащий определение функций класса и дружественных функций. 3-й файл содержит тест на тестирование функций нашего класса, имеет расширение cpp.

Замечание: деструктор не определяем, поскольку данные класса являются простыми переменными.

  1. Встроенные функции–члены класса. Статические члены класса.

Если функция-член класса определена прямо в теле класса, то неявно она считается встроенной. Использование встроенных функций обеспечивает более быстрое их выполнение. Для явного объявления встроенной функции необходимо использовать ключевое слово inline. В этом случае независимо от того, где определяется функция, в теле класса или вне его, система определяет её как встроенную.

Статические члены класса.

Статические элементы класса – такие элементы, которые имеют класс памяти static. Эти элементы являются глобальными объектами, которые принадлежат всему классу и существуют в единственном экземпляре. Статические элементы класса внутри класса только объявляются. А их определение и инициализация осуществляются вне класса.

  1. Функции-члены класса с квалификаторами const и volatile.

Функции-члены класса могут иметь квалификатор const или volatile, или два эти квалификатора вместе. Эти квалификаторы записываются после имени функции и позволяют обеспечить определённый доступ к константным объектам класса и к объектам класса, объявленным со спецификатором доступа volatile. Для константного объекта класса могут быть вызваны только те функции-члены класса, которые объявлены с квалификатором const. Для неконстантного объекта класса могут быть вызваны функции как с квалификатором const, так и без него. Поэтому функции-члены класса, которые не изменяют значения его атрибутов, нужно объявлять с квалификатором const. Запрещено объявлять константную функцию-член класса, которая модифицирует члены класса прямо или косвенно через неконстантные функции-члены класса. Константную функцию-член класса можно перегружать неконстантной функцией с тем же списком параметров.

Пример:

Class Counter

{ int n; //счётчик

public

counter (): n (0) {};

int count () const {return n;}

int count () {return ++n;}

};

int main ()

{counter m;

const counter k;

cout<<m.count ()<<endl; //1

cout<<k.count ()<<endl; //0

return 0;

}

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

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

Пример:

Class Counter

{ mutable int n; //счётчик

public

counter (): n (0) {};

int count () const {return ++n;}

};

int main ()

{const counter k;

cout<<k.count ()<<endl; //1

return 0;

}

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