Специальные функции-элементы относятся к некоторым функциям класса, от
которых зависят способы создания, копирования, преобразования и
уничтожения представителей (объектов) класса. Часто эти функции неявно
вызываются компилятором. Следующий список даёт краткое описание этих
функций.
Конструктор
Конструктор является функцией-элементом с тем же именем, что и её класс.
Она вызывается компилятором всегда, когда создаётся объект (экземпляр)
класса. Если Вы не определили ни одного конструктора, компилятор
генерирует конструктор по умолчанию (не имеющий параметров). Для
конструкторов выполняются следующие правила:
• для конструктора не указывается тип возвращаемого значения,
• конструктор не наследуется,
• Конструктор не может быть объявлен как const, volatile, virtual или static.
10 Объектно-ориентированное программирование на С++.
Пример №1. Определение конструктора класса.
class Point
{
private:
int x; int y;
public:
Point() // конструктор класса
{
x = 0; y = 0; // задание начальных значений координат
}
};
Задание №1
Определить конструкторы класса в классах «Прямоугольник» и «Точка»,
разработанных на практическом занятии №1.
Конструктор копии
Конструктор копии является конструктором специального вида: он
воспринимает в качестве аргумента константную ссылку на объект класса
(const тип_класса&) или простую ссылку на объект (тип_класса&). Если вы не
определите собственный конструктор копирования, компилятор реализует
свой, выполняющий побитовое копирование классов.
Пример №2. Определение конструктора копирования.
class Point
{
private:
int x; int y;
public:
Point(const Point& srcPoint) // конструктор копии
{
x = srcPoint.x
y = srcPoint.y
}
};
11 Объектно-ориентированное программирование на С++.
Задание №2
Определить конструкторы копирования в классах «Прямоугольник» и «Точка»,
разработанных на практическом занятии №1.
Операция присваивания
Операция присваивания является функцией-элементом с именем operator=,
который воспринимает единственный аргумент типа const тип_класса& (или
тип_класса&).
Операция присваивания вызывается компилятором, когда объекту
присваивается значение другого объекта. Компилятор генерирует
присваивание по умолчанию, если вы не определили операцию присваивания.
Присваивание по умолчанию производит побитовое копирование.
Пример №3. Определение операции присваивания.
class Point
{
private:
int x; int y;
public:
Point & operator = (const Point& Point)
{
Point::x = Point.x;
Point::y = Point.y;
return *this;
}
};
Задание №3
Определите операцию присваивания для классов «Точка» и «Прямоугольник»,
разработанных на практическом занятии №1.
Деструктор
Деструктор является дополнением конструктора. Он имеет то же имя, что и
класс, но с префиксом-тильдой (~). Он вызывается всякий раз, когда
уничтожается представитель класса. Для деструктора существует следующие
правила:
• Деструктор не может иметь аргументов.
• Деструктор не может возвращать значение.
• Деструктор не наследуется.
12 Объектно-ориентированное программирование на С++.
• Деструктор не может быть объявлен как const, volatile или static.
• Деструктор может быть объявлен как virtual.
Компилятор генерирует деструктор по умолчанию, если вы его не определяете.
!!! Всегда определяйте деструктор как virtual !!!
Пример №4. Определение деструктора.
Класс Line (линия) задан двумя точками.
class Line
{
private:
Point* m_p1;
Point* m_p2;
public:
virtual ~Line()
{
// m_p1, m_p2 должны быть созданы в конструкторе посредством new
delete m_p1;
delete m_p2;
}
};
Задание №4
Определите новый класс «Треугольник», заданный тремя точками на
координатной оси. Объявите конструктор по умолчанию, конструктор
копирования и операцию присваивания. Определите виртуальный деструктор
класса, разрушающий объекты класса «Точка» (объекты класса «Точка»
должны создаваться динамический посредством оператора new).
Функции преобразования
Представители класса могут быть преобразованы к другому типу с помощью
конструкторов преобразования или операции приведения.
Конструкторы преобразований
Если конструктор класса A воспринимает единственный аргумент типа B, то
говорят, что В может быть приведён к А с помощью преобразования
конструктором.
13 Объектно-ориентированное программирование на С++.
Операции приведения
Вы можете определить функции-элементы, которые будут осуществлять явное
преобразование типа класса к другому типу. Эти функции называют
операциями приведения.
operator <имя_нового_типа()>;
Операции преобразования подчиняются следующим правилам:
• Процедура преобразования не имеет аргументов.
• Процедура преобразования не имеет явной спецификации типа
возвращаемого значения.
• Процедура преобразования может описываться как virtual.
• Процедура преобразования наследуется.
Пример №5. Определение конструктора преобразования и операции
приведения.
class String
{
char m_str[100];
public:
String(const char* str) // Конструктор преобразования
{
strcpy(m_str, str);
}
operator char*() // Оператор преобразования
{
return m_str;
}
};
main()
{
String str("Hello, world");
cout << (char*)(str) << endl;
return 0;
}
14 Объектно-ориентированное программирование на С++.
Задание №5
Расширьте класс «String» (строка) из примера №5 для поддержки
конструктора копирования, конструктора инициализации (определите его как
String(int Length)) и конструктора по умолчанию. Воспользуйтесь
динамическим выделением памяти под строку (т.е. замените char m_str[100]
на char* m_str). Определите виртуальный деструктор, освобождающий
выделенную память под строку. Обеспечьте конструктор и операцию
преобразования строки для типа int.
Задание №5
Авиакомпания осуществляет рейсы, характеризующиеся: номером рейса,
аэропортом назначения, ценой за билет. Билеты продаются на определённый
рейс и характеризуются следующим: датой отправления, именем пассажира,
номером посадочного места. Система должна иметь возможность продать
билет (добавить) и сдать билет (удалить). Разработайте классы для
реализации данной задачи. Предусмотрите для каждого класса все виды
конструкторов, деструктор. |