Контрольные вопросы для подготовки и самостоятельной работы
1 Дайте определение понятиям: объект, класс, данные-члены класса, функции-члены класса.
2 В чём отличие между классом и объектом класса?
3 Можно ли определить функцию внутри класса?
4 Можно ли использовать в различных классах одинаковые имена данных и функций-членов?
5 Какие классы памяти можно использовать при объявлении объектов?
6 Можно ли использовать классы памяти при объявлении членов класса, почему?
7 Что означает термин инкапсуляция?
8 Как производится управление доступом к элементам класса?
9 Что означают спецификаторы доступа public, protected, private
10 Назовите спецификатор доступа по умолчанию к членам класса и структуры.
11 Ограничивается ли количество и порядок следования разделов в классе?
12 Назовите особенности использования статических (static ) членов класса.
13 Для чего используется оператор разрешения области видимости (::)?
14 Могут ли структуры содержать функции в качестве элементов?
15 Могут ли структуры и классы быть вложенными?
16 Какова область действия членов класса?
17 Как получить доступ к статическим членам класса из программы?
18 Можно ли объявить тип в теле класса при объявлении класса?
Лабораторная работа №21
Использование конструкторов и деструкторов
(2 часа)
Цель работы: изучить и научиться использовать механизм работы с конструкторами и деструкторами.
Теоретические сведения
Конструкторы и деструкторы
Существует несколько специальных функций-членов, определяющих, каким образом объекты класса создаются, инициализируются, копируются и разрушаются. Конструкторы и деструкторы являются наиболее важными из них. Они обладают большинством характеристик обычных функций-членов: объявляются в классе и определяются в пределах класса или вне его. Однако, они обладают и некоторыми уникальными свойствами:
|
1 Они имеют имя, совпадающее с именем класса ( деструкторы с символом тильды ~)
2 Конструкторов может быть несколько, деструктор только один.
3 Они не имеют объявлений типа возвращаемых значений (даже void).
4 Они не могут быть унаследованы, хотя производный класс может вызвать конструкторы и деструктор базового класса.
5 Конструкторы, как и большинство функций языка С, могут иметь аргументы по умолчанию или использовать списки инициализации элементов.
6 Деструкторы могут иметь атрибут virtual, но конструкторы не могут.
7 Нельзя работать с адресами этих функций.
Пример
void *ptr=base::base; // недопустимо, base()– функция-конструктор класса base
8 Вызвать конструктор тем же образом, что и обычную функцию, нельзя. Вызов деструктора допустим только с полностью уточненным именем.
Примеры
X *p; // указатель на класс Х
X x; // объявление объекта х класса Х
p=&x; // указатель p хранит адрес объекта х
p->X::~X(); // допустимый вызов деструктора
X::X(); // недопустимый вызов конструктора
9 При объявлении объектов компилятор вызывает один из конструкторов автоматически.
10 Аналогично при уничтожении объектов компилятор автоматически вызывает деструктор.
11 Конструкторы и деструкторы при необходимости динамического выделения объекту памяти могут выполнять вызовы операторов new и delete.
12 Конструктор создает объект х и инициализирует его данные-члены. При копировании объекта данного класса происходит неявный вызов соответствующего конструктора. Данные-члены объекта класса, у которого все элементы общедоступны (public) и без конструкторов или базовых классов (обычно это структура) могут инициализироваться при помощи списка инициализаторов. Деструктор разрушает объект класса, созданный конструктором, когда этот объект выходит из области видимости.
|
Конструкторы глобальных объектов вызываются до вызова функции main ().
Локальные объекты создаются, как только становится активной область действия (видимости) объекта. При этом конструктор вызывается каждый раз.
Class Х
{...public:
X(); // конструктор класса Х по умолчанию
// X(X); недопустимо
Х(const X&); // конструктор копирования – передаётся ссылка на Х
~X(); // деструктор класса Х
};
Формальные параметры конструктора при его объявлении могут быть любого типа, за исключением класса, элементом которого является данный конструктор. Конструктор копирования принимает в качестве параметра ссылку на свой собственный класс. Конструктор, не воспринимающий параметров, называется конструктором по умолчанию: Х::Х().
Х х; // объявлен объект х класса Х, вызывается конструктор по умолчанию
Как и все функции-члены, конструкторы могут иметь аргументы, используемые по умолчанию. Например, возможны следующие объявления конструкторов в классе:
Объявление класса | Определение конструкторов вне класса |
class X {int I, jпо- умолчанию private public: X();// конструктор по умолчанию X(int); //перегруженные конструкторы X(int, int);// могут вызываться c одним // X(int) или двумя X(int, int) аргументами X(int а = 5, int в= 6); //может вызываться без аргументов или с одним или двумя // аргументами X(const &); // конструктор копирования }; | Х::Х{i=Æ; j=Æ} Х::Х(int a) {i=a; j=Æ;} Х::Х(int a, int b) {i=a; j=b;} |
При вызове конструкторов следует избегать неоднозначностей main()