- •Обзорные лекции по курсу
- •1.Концепции и методология объектно-ориентированного программирования
- •2.Классы. Конструкторы и деструкторы
- •Void set_a(int num);
- •Void AnyClass::get_a()
- •Int AnyClass::set_a(int num)
- •Конструкторы и деструкторы. Список инициализации элементов
- •Void Show();
- •Int main()
- •Void Show();
- •Int main()
- •Статические члены класса
- •3. Простое и множественное наследование
- •Int GetX(){return X;}
- •Int GetY(){return у;}
- •Int GetX(){return X;}
- •Int GetY(){return y;}
- •Void ShowX(){cout « GetX() « ' ' ;}
- •Void ShowY(){cout « GetY()« ' ';}
- •OutCoord(int _x, int _y): Coord(_x, _y){}
- •Int GetX() {return X;}
- •Int GetY(){return y;}
- •Void ShowX(){cout « GetX() « ' ';}
- •Void ShowY(){cout « GetY()« ' ';}
- •Void ShowX(){cout « Coord::GetX() « ' ';}
- •PrintMsg(int _x, int _y, char* msg): Coord(_x, _y), SaveMsg(msg){}
- •Void set_a(int num);
- •Void AnyClass::get_a()
- •Int AnyClass::set_a(int num)
- •Void Show();
- •Int main()
- •Int GetX() {return X;}
- •PrintMsg(int _x, int _y, char* msg): Coord(_x, _y), SaveMsg(msg){}
- •Упражнения для самопроверки
Конструкторы и деструкторы. Список инициализации элементов
Создавая некоторый объект, его необходимо проинициализировать. Для этой цели C++ предоставляет функцию-член, которая называется конструктором. Конструктор класса вызывается всякий раз, когда создается объект его класса. Конструктор имеет то же имя, что и класс, членом которого он является, и не имеет возвращаемого значения. Например,
#include <iostream.h>
class AnyClass
{
int var;
public:
AnyClass(); //Конструктор
Void Show();
};
AnyClass:: AnyClass()
{
cout « 'В конcтрукторе\n';
var = 0;
}
void
AnyClass::Show()
{
cout « var;
}
Int main()
{
AnyClass ob;
ob.Show();
//...
return 0;
}
В этом примере конструктор класса AnyClass выводит сообщение на экран и инициализирует значение закрытой переменной класса var.
Программист не должен писать код, вызывающий конструктор класса. Всю необходимую работу выполняет компилятор. Конструктор вызывается тогда, когда создается объект его класса. Объект, в свою очередь, создается при выполнении оператора, объявляющего этот объект. Таким образом, в C++ оператор объявления переменной является выполнимым оператором.
Для глобальных объектов конструктор вызывается тогда, когда начинается выполнение программы. Для локальных объектов конструктор вызывается всякий раз при выполнении оператора, объявляющего переменную.
Функцией-членом, выполняющей действия, обратные конструктору, является деструктор. Эта функция-член вызывается при удалении объекта. Деструктор обычно выполняет работу по освобождению памяти, занятой объектом. Он имеет то же имя, что и класс, которому он принадлежит, с предшествующим символом ~ и не имеет возвращаемого значения. Рассмотрим пример класса, содержащего деструктор:
#include <iostream.h>
class AnyClass
{
int var;
public:
AnyClass(); //Конструктор
~AnyClass(); //Деструктор
void Show();
};
AnyClass::AnyClass()
{
cout « "Мы в конструкторе\n";
var = 0;
}
AnyClass::~ AnyClass()
{
cout « "Мы в деструкторе\n";
}
void
AnyClass::Show()
{
cout « var « "\n";
}
int main()
{
AnyClass ob;
ob.Show();
//...
return 0;
}
Деструктор класса вызывается в момент удаления объекта. Это означает, что для глобальных объектов он вызывается при завершении программы, а для локальных — когда они выходят из области видимости. Заметим, что невозможно получить указатели на конструктор и деструктор.
Обычно конструктор содержит параметры, которые позволяют при построении объекта задать ему некоторые аргументы. В рассмотренном выше примере конструктор инициализировал закрытую переменную var класса AnyClass значением 0. Если нужно проинициализировать переменные класса, используется конструктор с параметрами. Модифицируем предыдущий пример:
#include <iostream.h>
class AnyClass
{
int a, b;
public:
//Конструктор с параметрами
AnyClass(int x, int y);
//Деструктор
~AnyClass();
Void Show();
};
AnyClass::AnyClass(int x, int y)
{
cout « "Мы в конструкторе\n";
a = x;
b = у;
}
AnyClass::~ AnyClass()
{
cout « "Мы в деструкторе\n";
}
void
AnyClass::Show()
{
cout « a « ' ' « b « "\n";
}
Int main()
{
AnyClass ob(3,7);
ob.Show();
//...
return 0;
}
Здесь значение, переданное в конструктор при объявлении объекта ob, используется для инициализации закрытых переменных а и b этого объекта.
В отличие от конструктора, деструктор не может иметь параметров. Понятно, почему это сделано: незачем передавать аргументы удаляемому объекту.
Приведем правила, которые существуют для конструкторов:
• для конструктора не указывается тип возвращаемого значения;
• конструктор не может возвращать значение;
• конструктор не наследуется;
• конструктор не может быть объявлен с модификатором const, volatile, static или virtual.
Если в классе не определен конструктор, компилятор генерирует конструктор по умолчанию, не имеющий параметров.
Для деструкторов существуют следующие правила:
• деструктор не может иметь параметров;
• деструктор не может возвращать значение;
• деструктор не наследуется;
• класс не может иметь более одного деструктора;
• деструктор не может быть объявлен с модификатором const, volatile, static или virtual.
Если в классе не определен деструктор, компилятор генерирует деструктор по умолчанию.
Таким образом, конструкторы и деструкторы в C++ вызываются автоматически, что гарантирует правильное создание и удаление объектов класса.
Обычно данные-члены класса инициализируются в теле конструктора, однако существует и другой способ инициализации — с помощью списка инициализации элементов. Список инициализации элементов отделяется двоеточием от заголовка определения функции и содержит данные-члены и базовые классы, разделенные запятыми. Для каждого элемента в круглых скобках непосредственно за ним указывается один или несколько параметров, используемых при инициализации. В следующем примере для инициализации класса используется список инициализации элементов.
class AnyClass()
{
int a, b;
public:
AnyClass(int x, int y);
};
//Конструктор использует список инициализации
AnyClass::AnyClass(int x, int y): a(x), b(y)
{
//…
}
Хотя выполнение инициализации в теле конструктора или с помощью списка инициализации — дело вкуса программиста, список инициализации является единственным методом инициализации данных-констант и ссылок. Если членом класса является объект, конструктор которого требует задания значений одного или нескольких параметров, то единственно возможным способом его инициализации также является список инициализации.