Конструкторы и деструкторы объектов класса


Это специальный вид методов, которые резервируются за классом, хотя с позиции теории типов данных они не должны им принадлежать. Назначение конструкторов – создание и инициализация объектов.

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

 

Stock::Stock(const char* co, int n, double pr)

{

strncpy(company, co, 29);

company[29]=’\0’;

shares = n;

share_val = pr;

set_tot();

}

Stock::Stock()//конструктор по умолчанию, но определённый пользователем
{

strcpy(company, “None”, 29);

shares = 0;

share_val = 0;

set_tot();

}

 

Явные применения конструкторов в программе (2 синтаксически равноправные формы):

Stock stock1(“NanoSoft”,12,97.0);

Stock stock2 = Stock(“Boffo objects”,2,100.0);

...

stock2 = stock 1;//поля stock1 копируются в stock2

stock1 = Stock (“Nifty Foods”, 10, 93.05); //создаётся объект класса Stock и его поля //копируются в stock1, затем исходный объект уничтожается

 

Прим. Эти операции являются контр примерами и не будут работать так как невозможно копирование массивов – необходима спец методика, - создание так называемых конструкторов копирования.

 

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

 

Деструкторы – их назначение: освобождение памяти, занятой под объект. Имя деструктора совпадает с именем класса, но с лидирующим символом ‘~’. Параметры отсутствуют.

Деструктор по умолчанию:

Stock::~Stock(){}

 

Пользовательские деструкторы нужны в том случае, если в конструкторе используются ораторы выделения динамической памяти (напр. new – для создания объекта в области heap – памяти).

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

 

Пример

 

Stock *p_stock, *pp_stock;

p_stock = new Stock;

pp_stock = new Stock(“Boffo objects”);

 

Применение методов через указатель к объекту:

p_stock->show();

 

2-й конструктор в примере выше приведён неверно. Надо либо определить новый конструктор с 1-м параметром, либо переопределить старый, установив значение некоторых параметров по умолчанию, например так:

 

Stock::Stock(const char* co, int n = 0, double pr = 0.0)
{

strncpy(company,co,29);

}

 

Вопросы для самоконтроля

· Перечислите и объясните основные технологические характеристики ООП?

· Как выполняется переход от абстрактного описания к реализации в ООП?

· Как выглядит описание класса?

· Объясните атрибуты доступа public и private!

· В чем состоит принцип инкапсуляции данных?

· Как выглядят декларации методов в реализации класса?

· Назначение конструкторов и деструкторов?

· Когда требуется явное определение деструктора?

· Что означает ключевое слово inline?

· Как декларировать inline-метод без применения ключевого слова inline?

 

Лекция 20. С++: ссылочные переменные, перегрузка операций и дружественные типы данных



Дата добавления: 2016-05-26; просмотров: 2230;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.011 сек.