Конструкторы и деструкторы объектов класса
Это специальный вид методов, которые резервируются за классом, хотя с позиции теории типов данных они не должны им принадлежать. Назначение конструкторов – создание и инициализация объектов.
Конструкторы по умолчанию – конструкторы без параметров, которые создаются компилятором автоматически, если пользователь этого не сделал сам. Конструктор имеет в точности то же имя, что и класс, и их может быть определено несколько, например, они могут различатся числом и типами параметров:
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;