Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SHPORS~1.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
201.73 Кб
Скачать

8. Конструкторы и деструкторы.

Использование функций типа init() для инициализации объектов класса подвержено ошибкам. Т.к. нигде не сказано, что объект должен быть проинициализирован, программист может забыть об этом или сделать это дважды. Лучшим подходом будет предоставление программисту возможности объявить функцию, имеющую явное назначение – инициализация объектов. Т.к. функция создает (конструирует) экземпляр класса, она наз конструктором. Конструктор распознается по имени, которое совпадает с именем самого класса. Если класс имеет конструктор, все объекты этого класса будут проинициализированы. Конструктор может иметь аргументы. Можно иметь несколько способов инициализации, т.е несколько конструкторов, кот будут отличаться параметрами.

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

1. Создание автоматических объектов.

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

class Date{int d,m,y; public: Date(int,int,int);Date(int,int);Date(int);Date();Date(const char*);// дата в строковом представлении};

Для автоматических переменных память выделяется при входе в блок за счет стека.

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

В Date каждому аргументу м/б присвоено значение по умолчанию. class Date{ int d,m,y; public: Date(int dd=0, int mm=0,int yy=0);}; Date::Date(int dd,int mm,int yy){d=dd?dd:today.d;m=mm?mm:today.m;y=y?today.y//проверка того, что Date имеет допустимое значение.

2. Конструкторы для динамических типов.

Деструкторы

Конструкторы инициализируют объект, т.е. они создают среду, в которой работают функции-члены. Иногда создание такой среды подразумевает захват каких-то ресурсов (файл, блокировка, память), которые должны быть освобождены после их использования. В результате, некот классам требуется функция, которая будет гарантированно вызвана при уничтожении объекта. Такие функции наз деструкторами. Они очищают память и освобождают ресурсы. Деструкторы вызываются неявно, когда автоматическая переменная выходит из области видимости, удаляется объект, хранящийся в свободной памяти и т.д.

Деструктор – это функция-член класса, которая не имеет параметров, не возвращает значение. Имя деструктора – это имя класса с символом ~.

Пример: class Vector{int *v,size; public: Vector(){size=DEFAULT(size); v=new int[size];} Vector (int sz){size=sz;v=new int[size];}Vector (Vector vect){size=vect.size;v=new int[size]; for (i=0;I<size;I++)v[I]=vect.v[i];} ~Vector(){delete v[size];}};

9. Инициализация полей класса. Статические члены класса.

Инициализация: 1. class complex {int Re,Im; public: complex (){Re=0; Im=0;};…};

2. complex():Re(0),Im(0);

class Date{ int d,m,y; public: Date(int dd=0, int mm=0,intyy=0);}; Date::Date(int dd,int mm,int yy){d=dd?dd:today.d;m=mm?mm:today.m;y=y?today.y//проверка того, что Date имеет допустимое значение.

Здесь Date зависит от глобальной переменной today. Класс Date теперь можно применять только в том контексте, в кот today определена. Это делает класс бесполезным вне контекста, в кот он был изначально написан.

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

class Date{ int d,m,y; static Date default_date; public: Date(int dd=0, int mm=0,int yy=0);//…;static void set_default(int,int,int);}; Date::Date(int dd,int mm,int yy){d=dd?dd:default_date.d;m=mm?mm:default_date.m;y=y?default_date.y//проверка на допустимость значения Date }

Мы можем изменить дату по умолчанию в любой момент. К стат членам можно обращаться так же, как и к любым другим членам. Кроме того, к стат члену можно обращаться без указания имени объекта. Вместо этого в качестве квалификатора его имени используется имя самого класса. Например: void f(){Date::set_default(4,5,89);}

Стат члены (функции и данные) должны быть где-то определены. Например: Date Date::default_date(16,12,89); void Date::set)default(int d,int m,int y){Date::default_date=Date(d,m,y);}

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