|
Программирование >> Программирование на языке c++
А* A::copy constructor() псевдовиртуальный конструктор { А* a=new А; a->copy(this); return а; } void f(A* р) { А* pn=p->copy constructor(); выполнение каких-то действий с объектом *рп delete рп; } удаление объекта *рп void main(void) { А а; построение объекта а класса А f(&a); вызов функции f Результаты выполнения программы представятся в виде: A CON A CON A DES A DES В заключение сформулируем основные выводы и правила: 4- деструктор может быть виртуальным, а конструктор - нет; 4- виртуальный деструктор позволяет вызвать правильный деструктор через указатель УБ на базовый класс Б, даже если УБ содержит значение, указывающее на производный класс П (Б<-П); если класс Б содержит виртуальный деструктор и Б<-П, то деструктор класса П тоже будет виртуальным; 4- при необходимости можно определить псевдовиртуальный конструктор с помощью конструктора без аргументов и виртуальной функции для копирования; 4- специальный конструктор без аргументов позволяет для заданного объекта создать новый объект того же типа; 4 псевдовиртуальный конструктор (виртуальная функция) для копирования позволяет построить копию заданного объекта; 4- если задать дополнительный аргумент для функции, указанной в предыдущем пункте, то можно осуществлять копирование как одного объекта, так и множества взаимосвязанных объектов. 5. ДООПРЕДЕЛЕНИЕ ОПЕРАТОРОВ (РАСШИРЕНИЕ ФУНКЦИОНАЛЬНЫХ ВОЗМОЖНОСТЕЙ ОПЕРАТОРОВ) 5.1. Основные принципы доопределения операторов Программы на языках С и С++ используют некоторые ранее определенные простейшие классы (типы), такие, как целые - int, символьные - ciiar, вещественные - float и т. п. Мы можем описать объекты указанных классов, например: int a,b; char c,d,e; float f; Здесь переменные a, b, c, d, e, f можно рассматривать как простейшие объекты. В языке определены множества операций над простейшими объектами, выражаемых через операторы, такие, как +, -, *, I, % и т.п. Каждый оператор можно применить к операндам определенного типа. Например, если задано описание: float а, Ь=3.123, с=6.871; то из следующих двух выражений: а = с + Ь; нет ошибки а = с % Ь; ошибка: illegal use of floating point второе является ошибочным, поскольку операция % должна быть приложена лишь к объектам целого типа. Сказанное позволяет сделать следующий вывод: операторы языка можно применять лишь к тем объектам, для которых они были определены. К сожалению, лишь ограниченное число типов непосредственно поддерживается любым языком программирования. Например, языки С, С++ не позволяют выполнять операции с комплексными числами, матрицами, строками, множествами и т.п. Однако все эти операции можно определить через классы в языке С++. Рассмотрим пример. Пусть заданы множества А и В: А = { а1,а2,аз }; В = { аз.ад.аз }, и мы хотим выполнить операции типа пересечения & и объединения I множеств (в математике соответствующие операторы задаются как п и и, но для наших пояснений это неважно): А & В = { а1,а2,аз } & { аз,а4,а5 } = { аз }; А I В = { а1,а2,аз } { аз,а4,а5 } = { а1,а2,аз,а4,а5 }. К сожалению, языки C/C++ не поддерживают непосредственно эти операции, однако в языке С++ можно объявить класс, назвав его, например, set (множество). Далее можно определить операции над этим классом, выразив их с помощью знаков операторов, которые уже есть в языке С++, например, & и . В результате операторы & и можно будет использовать как и раньше, а также снабдить их дополнительными функциями (функциями объединения и пересечения множеств). Как определить, какую действительную функцию должен выполнять оператор: старую или новую? Это очень просто. Надо посмотреть на типы операндов в соответствующем выражении. Если операнды - это объекты целого типа, то нужно выполнить операцию побитовое И или побитовое ИЛИ . Если же операнды - это объекты типа set, то надо выполнить объединение или пересечение соответствующих множеств. Рассмотрим другой пример. Создадим тип данных комплексное число с помощью класса complex: class complex { double re.lm; public:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |