Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Конструктор и деструктор




При создании объектов, можно сразу же проинициализировать элементы данных класса (свойства объекта), и выполняет эту функцию конструктор. Конструктор – специальная функция, которая выполняет начальную инициализацию элементов данных, причём имя конструктора обязательно должно совпадать с именем класса. Важным отличием конструктора от остальных функций является то, что он не возвращает значений вообще никаких, в том числе и void. В любом классе должен быть конструктор, даже если явным образом конструктор не объявлен (как в предыдущем классе), то компилятор предоставляет конструктор по умолчанию, без параметров. Деструктор класса – метод, выполняющий противоположную функцию – разрушения объекта класса. Имя деструктора должно совпадать с именем класса, но с добавлением символа тильда " ~ ". Доработаем класс data, добавив к нему конструктор data() и деструктор ~data().

class data { private: int day, // день month, // месяц year; // год public: data(int n_day, int n_month, int n_year) // конструктор класса data { set(n_day, n_month, n_year); // вызов set-функции установки даты } ~data() // деструктор класса data {} // пустое тело деструктора // * * * // остальные методы класса data }; int main(int argc, char* argv[]) { data X(11,2,2013); // объявление объекта и инициализация элементов данных X.message(); // вызов функции message X.get(); // отобразить дату data *Y; // указатель на объект класса data Y= new data(12,2,20113); // вызов конструктора для создания объекта int j= Y->get_year(); // вызов метода get_year() delete Y; // вызов деструктора для удаления динамического объекта system("pause"); return 0; }

Конструктор здесь имеет три параметра, через которые он получает информацию о дате. В теле конструктора вызывается set-функция для установки даты. При объявлении (и создании) объекта класса вызывается конструктор, которому в списке фактических параметров передаются три аргумента. Затем, в конструкторе выполняется начальная инициализация закрытых элементов данных.

Конструктор статического объекта вызывается автоматически в момент его описания, а деструктор – в конце области существования переменной – объекта класса. Место в программе для создания и уничтожения динамического объекта определяется программистом: оператор new вызывает констркутор, а оператор delete – деструктор метода. В данном примере задается динамический объект Y класса data. Для его создания используется опереатор new, вызывающий конструктор data() для инициализации элементов данных экземпляра класса. Соответственно, оператор delete вызывает деструктор ~data(), предназначенный для освобождения динамических областей памяти (в данном примере, правда, тело деструктора пусто).

Отделение интерфейса от реализации

Для написания различных программ можно пользоваться разработанным ранее классом, для этого необходимо подключить (#include) заголовочный файл (*.h), в котором он объявлен.

// заголовочный файл data.h #include <iostream> using namespace std; class data { private: int day, // день month, // месяц year; // год public: data(int n_day, int n_month, int n_year) // конструктор { set(n_day, n_month, n_year); } ~data() { } // деструктор void message() // вывод сообщения на экран { cout << "тестовое сообщение объекта класса data\n"; } void set(int n_day, int n_month, int n_year) // установка даты { day = n_day; // инициализация свойства день month = n_month; // инициализация свойства месяц year = n_year; } // инициализация свойства год void get() // отобразить текущую дату { cout << "date: " << day << "." << month << "." << year << endl; } int get_year() // возвращает значение свойства "год" { return year; } };

Чтобы главная функция увидела созданный нами класс и смогла его использовать, необходимо включить определение класса в исполняемом файле, с функцией main():

// файл главной функции test.cpp #include "stdafx.h" #include "data.h"// подключение библиотеки класса data int main(int argc, char*argv[]) { data *Y= new data(12,2,20113); // динамический объект класса data cout << Y->get_year() << endl; Y->message(); Y->get(); delete Y; // удаление динамического объекта system("pause"); return 0; }

Интерфейс класса

Интерфейс класса – конструкция, определяющая методы и свойства, предоставляемые классом – описание типа данных и прототипов методов. Реализация класса – это способ осуществления алгоритмов работы класса – описание/задание тел методов. До этого мы не отделяли интерфейс класса от его реализации, то есть реализация методов осуществлялась внутри класса. Отделение интерфейса от реализации класса выполняется для того, чтобы скрыть способ осуществления работоспособности класса. Отделение интерфейса от реализации выполняется за 5 шагов:

  1. добавить в проект заголовочный файл *.h;
  2. определить интерфейс класса в заголовочном файле
  3. добавить в проект исполняемый файл *.cpp;
  4. в исполняемом файле выполнить реализацию класса;
  5. подключить заголовочный файл к программе.

Имена заголовочному и исполняемому файлам даются, как правило, одинаковые:

// заголовочный файл data.h #include <iostream> using namespace std; class data { private: int day, // день month, // месяц year; // год public: data(int, int, int); // прототип конструктора ~data(); // прототип деструктора void message(); // прототипы других методов класса: void set(int, int, int); void get(); int get_year(); };

В интерфейсе класса остались объявленные переменные и прототипы методов класса. Теперь рассмотрим содержимое файла реализации методов класса:

// файл реализации класса data.cpp #include <iostream> using namespace std; #include "data.h"// подключение заголовочного файла класса data // реализация методов класса data: data::data(int n_day, int n_month, int n_year) // конструктор { set(n_day, n_month, n_year); } data::~data() { } // деструктор c реализацией void data::message() // вывод сообщения на экран { cout << "тестовое сообщение объекта класса data\n"; } void data::set(int n_day, int n_month, int n_year) // установка даты { day = n_day; // инициализация свойства день month = n_month; // инициализация свойства месяц year = n_year; } // инициализация свойства год void data::get() // отобразить текущую дату { cout << "date: " << day << "." << month << "." << year << endl; } int data::get_year() // возвращает значение свойства "год" { return year; }

Так как методы класса объявляются вне тела класса, то необходимо связать реализацию метода с классом. Методы класса объявляются (задаются) точно так же как и функции, только перед именем метода необходимо написать имя класса и поставить бинарную операцию разрешения области действия " :: ". Бинарная операция разрешения области действия привязывает метод, объявленный извне, к классу:

// синтаксис объявления методов класса вне тела класса /*возвращаемый тип данных*/ /*имя класса*/::/*имя метода*/(/*параметры*/) { // операторы }

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

// файл главной функции test.cpp #include "stdafx.h" #include "data.h"// подключение библиотеки класса data int main(int argc, char*argv[]) { data *Y= new data(12,2,20113); // динамический объект класса data cout << Y->get_year() << endl; Y->message(); Y->get(); delete Y; // удаление динамического объекта system("pause"); return 0; }
Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...