- •Оглавление
- •1 Основные методы программирования. Лекция №2 5
- •2 Методы объектно-ориентированного программирования. Лекция №6. 15
- •2.4 Вопросы по теме 54
- •3 Объектно-ориентированное проектирование. Лекция №12 55
- •3.4 Вопросы по теме 74
- •Введение. Лекция №1.
- •1Основные методы программирования. Лекция №2
- •1.1Процедурное программирование Методы процедурного программирования
- •Этапы разработки программ. Лекция 3.
- •1.2Объектно-ориентированное программирование Лекция №4
- •Этапы разработки оо программ. Лекция №5
- •Конструкторы и деструкторы. Лекция №7.
- •Друзья класса
- •2.2Наследование. Лекция №8
- •Производный класс
- •Простое наследование
- •Множественное наследование. Лекция №9
- •Виртуальные базовые классы
- •2.3Полиморфизм. Лекция №10
- •Перегрузка операций
- •Преобразования типов, определяемые классом
- •Перегрузка функций.
- •Чистый полиморфизм
- •Виртуальные элементы-функции
- •Абстрактные классы. Лекция №11.
- •Параметрический полиморфизм
- •Шаблоны функций
- •Шаблоны классов
- •2.4Вопросы по теме
- •3Объектно-ориентированное проектирование. Лекция №12
- •3.1Концепция объектно-ориентированного проектирования
- •3.2Проектирование структурной схемы программы Составление начальной иерархии и структуры классов
- •Реорганизация иерархии и структуры классов
- •Организационная структура программы
- •3.3Проектирование файлов интерфейсов классов. Лекция № 13. Файл интерфейса базового класса
- •Файлы интерфейсов производных классов
- •Файл управления
- •3.4Вопросы по теме
- •Общие моменты разработки программы на основе объектно-ориентированного подхода
- •Приложение а
Конструкторы и деструкторы. Лекция №7.
Конструктор - это специальная элемент-функция, служащая для инициализации элементов-данных объекта класса. Конструкторы можно разделить на конструкторы инициализации и копирования.
Конструктор характеризуется следующими свойствами:
напоминает обычную функцию, но с именем, совпадающим с именем класса, и без типа возвращаемого значения;
автоматически вызывается компилятором при объявлении объекта класса; если конструктор отсутствует, то компилятор генерирует конструктор по умолчанию (без параметров), так как он может вызывать конструкторы базовых классов, если они есть;
не может быть const, static, virtual и не наследуется;
использует два способа инициализации элементов-данных: списком инициализации и телом конструктора; элементы-константы и ссылки инициализируются только списком.
Пример:
class akt
{
int tabn;
float objem;
public: //инициализация списком //инициализация телом
akt(int x, float y): tabn(x), objem(y) //akt(int x,float y)
{} //tabn=x objem=y //{tabn=x; objem=y;}
};
main() //}
{
akt obj1(1,100000);//x=1 y=100000
}
Конструктор копирования служит для инициализации нового объекта класса значениями другого объекта того же класса, т.е. для копирования задаваемых элементов-данных одного объекта в другой. Конструктор характеризуется следующими особенностями:
имеет в качестве параметра либо константную ссылку на объект класса, например, const akt& obj, либо простую ссылку на объект, например, akt& obj (с const предпочтительней);
если конструктор копирования отсутствует, то компилятор генерирует конструктор по умолчанию; этот конструктор копирует все элементы-данные копируемого объекта.
Добавим в предыдущий пример конструктор копирования.
class akt main()
{ ... {
akt(const akt& obj) akt obj1(1,100000);
{ ...
tabn=obj.tabn; //копирование obj1 в obj2
objem=obj.objem; akt obj2=obj1;//или akt obj2(obj1);
} ...
}; }
Деструктор служит для уничтожения объектов класса. Деструктор характеризуется следующими свойствами:
имеет имя класса с префиксом-тильдой (~) и не имеет возвращаемого значения и параметров, например, ~akt();
автоматически вызывается компилятором при выходе из области видимости или при выполнении операции delete для объектов, размещенных в динамической памяти при помощи операции new;
не может быть const, static, virtual , и не наследуется.
Друзья класса
Доступ к элементам защищенной (protected) и закрытой (private) частей класса из внешних функций или из функций других классов (не производных) запрещен. Но можно обойти этот запрет, объявив функцию или целый класс дружественной данному классу. Другом класса может быть: внешняя функция, элемент-функция другого класса, целый другой класс.
Использование друзей класса - достаточно спорный прием, так как он нарушает одно из основных понятий - инкапсуляцию. Поэтому, необходимы обоснованные причины, например, необходимость привилегированного доступа какой-то функции (по сравнению с другими) к элементам нескольких классов.
Синтаксис объявления друзей класса:
class cl1
{
friend tf1 f1(ta1 a1[,...]); //внешняя функция
friend tf2 cl3::f2(tb1 b1[,...]);//функция класса cl3
friend class cl2; //класс cl2
...
};
Друзья класса характеризуются следующими свойствами:
объявляются со словом friend в любой части класса;
могут быть дружественными более чем одному классу;
не могут быть взаимно друзьями; если класс cl2 является другом cl1, то это не означает, что cl1 является другом cl2;
дружественность не наследуется производными классами друга; если cl2 - друг cl1, то производные классы от cl2 не являются друзьями cl1;
дружественность не наследуется производными классами от данного класса; если cl2 - друг cl1, то это не означает, что cl2 является другом классам, производным от cl1;
дружественность не транзитивна; если cl2 - друг cl1, то это не означает, что друзья cl2 являются друзьями cl1.