
Урок #19 - Конструкторы и деструкторы
Видеоурок
Конструктор класса очень удобен и по своему виду схож с обыкновенными функциями. За счёт конструктора мы можем установить значения для объекта сразу при его создании.
Конструктор должен иметь одинаковое название с классом. Пример создания конструктора показан ниже:
class Book {
private:
int pages;
float weight;
public:
char name;
void getInfoBook () {
cout << "В книге " << name << " находиться " << pages << " страниц. " << endl;
cout << "При этом она весит " << weight << endl;
}
Book (int _pages, float _weight) {
pages = _pages;
weight = _weight;
}
Book (int _pages, float _weight, char _name) {
pages = _pages;
weight = _weight;
name = _name;
}
};
В одном классе может быть сразу несколько конструкторов. Создав несколько конструкторов мы можем передавать разное количество параметров при создании объекта.
Компилятор сам определяет какой конструктор необходимо использовать в зависимости от передаваемых параметров и их типов данных.
В коде выше переменные идут с модификатором доступа private
. Дело в том, что все переменные лучше делать либо private, либо protected. Доступ к переменным должен осуществляться только за счёт методов и конструкторов. Доступ к полям напрямую должен быть закрыт.
Дополнительно создадим два объекта и выведем информацию:
int main() {
Book sherlock_holms(460, 1.7f); // Используем 1 конструктор
sherlock_holms.name = 'S'; // Устанавливаем вручную значение для name
sherlock_holms.getInfoBook ();
Book green_mile(750, 2.8f, 'G'); // Используем второй конструктор
green_mile.getInfoBook ();
return 0;
}
Поскольку переменная name
имеет public модификатор доступа, то мы можем ссылаться к ней отдельно. Лучше так не делать и для неё тоже установить модификатор private.
Также конструктор может не принимать параметров. В таком случае при создании объекта ничего не надо дополнительно передавать.
Деструкторы
class Some {
public:
~Some () {
cout << "Работа с объектом завершена.";
}
};
Исходный код
using namespace std;
class Auto {
private:
int year, month, day;
public:
Auto () {
year = 2000;
month = 12;
day = 31;
get();
cout << endl;
}
Auto (int date_year, int date_month, int date_day) {
year = date_year;
month = date_month;
day = date_day;
get();
cout << endl;
}
void message () {
cout << "Class is working!" << endl;
}
void set (int date_year, int date_month, int date_day) {
year = date_year;
month = date_month;
day = date_day;
}
void get () {
cout << "Year of this auto is - " << year << ", month is - " << month << ", day is - " << day << endl;
}
~Auto () {
cout << "Class is not working" << endl;
}
};
int main(int argc, const char * argv[]) {
Auto shkoda (2015, 2, 13);
shkoda.message();
shkoda.set(2005, 11, 23);
shkoda.get();
Auto bmw;
bmw.set(2012, 1, 11);
bmw.get();
cin.get();
return 0;
}
Задание к уроку
Необходимо оформить подписку на проект, чтобы получить доступ ко всем домашним заданиям
Большое задание по курсу
Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца
Также стоит посмотреть