- •«Объектно–ориентированное программирование»
- •1. Объектно–ориентированный подход к разработке программного беспечения: основные понятия, концепции и принципы.
- •Void main(){ demo a("Ok"), b(a); a.Out(); b.Out();}
- •X(); // derived class
- •Int size;
- •Vector(int);
- •Void main() {
- •Void noex(int I) throw();
- •10. Библиотека stl: назначение, основные элементы.
- •Void main(){try{ throw 10; }
- •Void foo() throw(int,over_flow);
- •11. Контейнеры stl: понятие, виды, основные операции, приемы использования.
- •12. Итераторы stl: понятие, виды, основные операции, приемы использования.
- •Int main()
Void main(){ demo a("Ok"), b(a); a.Out(); b.Out();}
В C++ конструктор копирования является единственным средством создания копий объекта. Конструктор копирования - обязательный элемент любого класса. Он также может быть переопределён подобно конструктору умолчания. Спецификатор const (конструктор копирования работает с адресом объекта) предохраняет объект-параметр от случайной модификации в теле конструктора.
Операторы new и delete предназначены для динамического распределения памяти и могут использоваться в С++ - программах вместо функций malloc() и free().
Оператор new имеет два допустимых формата вызова:
[::] new [список_аргументов] тип [инициализатор]
[::] new [список_аргументов] (тип) [инициализатор]
Тип - это тип данных, для которых необходимо зарезервировать память.
Инициализатор - значение, используемое для инициализации данных в памяти.
Для удаления элементов классов вызывается деструктор. В некоторых реализациях языка вызов оператора delete для несуществующего или пустого указателя приводит к возникновению исключения.
4. Наследование: понятие, простое наследование, режимы наследования и их применение. Примеры на языке C++.
Наследование — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.
Другими словами, класс-наследник реализует спецификацию уже существующего класса (базовый класс). Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса.
Простое наследование - класс, от которого произошло наследование, называется базовым или родительским (англ. base class). Класс, который произошел от базового, называются потомком, наследником или производным классом (англ. derived class): class B: public A {/*…*/}; класс B является наследником A. Это также означает, что любой объект типа B также является объектом (разновидностью) типа A (но не наоборот!).
Наследование:
Открытое (public) наследование. Отражает зависимость «являться». Все члены базового класса становятся членами класса-наследника (как интерфейс, так и реализация).
Закрытое (private) наследование. Об этом подробнее. Пусть имеется класс B, который открыто, наследует класс A. Такое наследование дает ряд преимуществ. Одним из них является то, что можно обращаться к классам-наследникам через указатель на базовый класс, т.е.: A *some = new B; // все хорошо: A – базовый класс, произойдет неявное преобразование Но теперь проделаем небольшую корректировку (а именно заменим public-наследование на private):
class A { /*…*/ };
class B: private A { /*…*/ };
Если попытаться написать
A *some = new B;
То компилятор выдаст ошибку. public-наследованием объект одного типа _ является_ разновидностью другого типа, а по поводу private такого сказать нельзя. Private-наследование используется только на этапе реализации, и оно скорее выражает зависимость «реализовано на основе». Т.е. на этапе проектирования private-наследование никоим образом не фигурирует, а появляется только на этапе написания программного кода. private-наследование в большинстве случаев можно заменить обычным внедрением, т.е. созданием члена-указателя на нужный класс.
Защищенное (protected) наследование – очень редко встречающийся на практике вид наследования. При protected-наследовании все члены с модификатором public наследуются с модификатором protected (т.е. все открытые члены базового класса становятся защищенными членами класса-наследника).
5. Полиморфизм и его реализация посредством раннего и позднего связывания. Примеры на языке C++.
Полиморфизм – это третья составляющая ООП, наряду с инкапсуляцией и наследованием. Полиморфизм, означает, что клиент может рассматривать разные объекты как одинаковые на определенном уровне абстракции, и каждый из объектов будет вести себя соответствующим образом.
Полиморфизм реализуется посредством виртуальных функций. Если при использовании виртуальной функции запрос осуществляется с помощью указателя базового класса (или ссылки), то С++ выбирает правильную переопределённую функцию в производном классе, связанном с данным объектом.
Рассмотрим в качестве базового класса – класс форм Shape и несколько производных классов: Circl (круг), Rectangle (прямоугольник), Square (квадрат). Каждый из производных классов имеет свою функцию Draw, которая умеет рисовать соответствующую форму. Можно работать с объектами этих фигур, как с объектами базового класса Shape, не разбираясь в истинной природе каждого объекта.
class Shape{public: virtual void Draw(void);};
class Circl : public Shape{public: void Draw(void);};
class Rectangle : public Shape{public: void Draw(void);};
class Square : public Shape{public: void Draw(void);};
Shape * ShapeArray[10]; // создаём массив указателей базового класса
ShapeArray[0]=new Circl(); // загружаем массив указателями на объекты
ShapeArray[1]=new Rectangle(); разных фигур
ShapeArray[2]=new Square();
for(int i=0, i<3, i++)\
ShapeArray[i]->Draw(); // каждая фигура будет рисоваться своей функцией
Таким образом, интерпретация каждого вызова виртуальной функции через указатель на базовый класс зависит от значения этого указателя, т.е. от типа объекта, для которого выполняется вызов. Выбор того, какую виртуальную функцию вызвать, будет зависеть от типа объекта, на который фактически (в момент выполнения программы) направлен указатель, а не от типа указателя. Виртуальными могут быть только нестатические функции-члены.
Вирт.ф-ции предоставляют механизм позднего (отложенного) или динамического связывания. Любая нестатическая функция базового класса может быть сделана виртуальной, для чего используется ключевое слово virtual:
virtual тип имя_функции (списк_формальных _параметров);
Виртуальность наследуется. После того как функция определена как виртуальная, ее повторное определение в производном классе создает в этом классе новую виртуальную ф-цию, причем спецификатор virtual может не использоваться списке базовых классов при объявлениях классов с помощью ключевого слова virtual можно обеспечить разрешение проблемы множественного наследования. Нельзя указывать базов. кл. более 1раза при описании производного класса,но если добавить ключ. слово virtual ситуация меняется.
Пример разрешения конфликтов множественного наследования:
class X : virtual public B { ... }
class Y : virtual public B { ... }
class Z : public X, public Y { ... }
Объект класса Z имеет только 1 экземпляр объекта класса B.
Конструкторы виртуальных базовых классов выполняются до выполнения конструкторов других базовых классов.
Пример class X : public Y, virtual public Z:
Cоздание объекта класса X приведет к следующей последовательности вызовов:
Z(); // virtual base class initialization
Y(); // non-virtual base class
