
- •1. Объектно-ориентированное программирование как методология проектирования программных средств.
- •1.2. Объект
- •Iarray a(10), b(25), c(45);
- •Int main(void)
- •2.1. Перегрузка имен функций
- •Int print(int);
- •Void print(int);
- •Int (*matrix)[10];
- •Void main(void)
- •Void incr(int &aa)
- •3.2 Объявление класса.
- •Имя_класса имя объекта;
- •Имя объекта. Имя элемента
- •Имя_объекта. Имя_метода( );
- •Имя класса *this;
- •Имя_класса (список формальных параметров)
- •Листинг 3.4
- •V_3d( double &X, double &y,double &z)
- •Void main(void)
- •Х:: х(const х&)
- •V_3d::v_3d(const v_3d& v1)
- •Void v_3d::print()
- •Сlass X
- •Void main (void)
- •4. Перегрузка операций
- •V_3d(double x1,double y1,double z1)
- •Void print();
- •Void main(void)
- •Void v_3d::print()
- •4.3.1. Использование дружественных функций при перегрузке операций
- •Void print();
- •Void main(void)
- •Void v_3d::print()
- •4.3.2.Особенности использования дружественных функций
- •Имя объекта. Имя_функции
- •Void f1( X& );
- •Void f2 ( X* );
- •Void main(void)
- •5. Производные классы
- •Int Bfunc( );
- •Int Xfunc( );
- •Int Efunc( X & x1 );
- •Istream
- •Iostream
- •Ifstream
- •С помощью манипуляторов – специальных операций, вставляемых непосредственно в поток вывода.
- •Int width( int w);
- •Int precision( int p);
- •Void main(void)
- •Void open(char* filename, int mode, int access);
- •If(!fout) {
- •7. Виртуальные функции
- •Circle a;
- •A.Build();
- •Virtual double a(double X)
- •Void main (void)
- •Void Graphics Object :: Build() { };
- •8.Шаблоны функций и классов
- •Void main(void)
- •Void Swap ( SwapType &X, SwapType &y)
- •Void main(void)
- •Int a, double b;
- •Int sloc,rloc;//начало и конец очереди
- •Void qput(t I); // помещение элемента в очередь
- •Int main(void)
- •1.Какой принцип ооп реализуется с помощью шаблонных функций и классов?
- •2.Когда целесообразно использовать шаблоны функций? Каков общий вид объявления шаблона функции?
Void Graphics Object :: Build() { };
Версия виртуальной функции, которая, с одной стороны, должна быть определена, а с другой, никогда не должна использоваться, должна быть объявлена как чисто виртуальная функция, для чего используется следующая основная форма:
virtual тип имя_функции (список параметров=0;
Например определение класса Graphics Object может быть изменено следующим образом:
class Graphics Object {
// элементы – данные класса
……………
public:
// методы класса, необходимые для работы с любым графическим объектом
virtual void Build() =0; // построить
virtual void Display();=0; // показать на экране
// другие методы
…………..
};
В классах производных от класса Graphics Object, при наличии своих версий виртуальных функций Build() и Display() они должны быть либо определены, либо, в свою очередь, объявлены как чисто виртуальные функции.
При выполнении программы при обращении к чисто виртуальной функции выдается соответствующее сообщение и программа аварийно завершается.
Чисто виртуальные функции полезны в следующем: они позволяют установить контроль со стороны компилятора за ошибочным созданием объектов “фиктивных” типов, таких, как Graphics Object в нашем примере.
Класс с одной или большим количеством чисто виртуальных функций называется абстрактным классом.
Правила языка С++ запрещают создание объектов таких типов. Абстрактный класс может быть использован только как базовый для последующих порождений новых классов.
Причина, по которой абстрактные классы не могут использоваться как объявления объекта, состоит в том, что одна или более функция не имеет определения.
Контрольные вопросы
1.Какой принцип ООП реализует механизм виртуальных функций?
2.Когда следует использовать механизм виртуальных функций в программе?
3.В чем сущность метода динамического связывания?
4.В чем смысл идеи “один интерфейс, множество методов”?
5.В чем состоят особенности вызова виртуальной функции через указатель на класс?
6.Когда может быть проигнорирован механизм виртуальных функций?
7. Что такое абстрактный класс? Можно ли создавать объекты абстрактных классов?
8.Шаблоны функций и классов
Это еще одна реализация полиморфизма. Этого механизма не было в первых компиляторах TURBO C++ и BORLAND C++. Шаблоны позволяют создать универсальный фрагмент кода, а затем использовать его многократно с различными типами данных или различными объектами. С помощью шаблонов можно уменьшить размер и сложность программ.
8.1. Шаблоны функций
Шаблоны функций позволяют использовать в качестве аргумента функций тип переменной.
Рассмотрим следующую задачу. Нужно написать функцию cub() для возведения в третью степень передаваемого аргумента.
Можно использовать механизм перегрузки функций, и три (или более) функций будут иметь одно и то же имя, но отличаться типом аргумента и типом возвращаемого значения. Нам придется для каждого типа создавать свое тело функции, причем отличаться функции будут только типами аргументов.
Шаблоны функций обычно объявляются в заголовочном файле.
Общий вид объявления шаблона функции:
template < class T > тип возвращаемого значения имя (список параметров)
{
//тело функции
}
Здесь T - имя типа, параметр шаблона. Это указание компилятору, что T - определяемое пользователем имя типа.
Необходим, по крайней мере, один параметр T для передачи функции данных для обработки. Можно задать указатель (T * param) или ссылку (T & param).
Функция может объявлять несколько параметров и возвращать значение параметрического типа, например:
template < class T> T f(int a, T b)
{ // тело функции }
В листинге 8.1 приведен пример программы, решающей поставленную задачу.
Листинг 8.1
// Шаблон функции для возведения в куб параметра функции
template <class T>
T cub( T X)
{
return X*X*X;
};