- •Конспект по "Объектно-ориентированному программированию".
- •1. Что такое объект? Понятия "состояние" и "поведение"?
- •2. Понятия "интерфейс" и "реализация"?
- •3. Понятия "класс" и "абстрактный тип данных"?
- •4. Основные категории классов?
- •5. Объявление класса? Общий вид объявления класса? Включение кода метода внутри объявления класса?
- •6. Особенности локальных классов?
- •7. Понятие inline-метода. Способы создания?
- •9. Константный объект? Константный метод?
- •10. Конструктор. Его назначение и синтаксические конструкции вызова конструктора?
- •11. Конструктор копирования. Общий вид и случаи вызова?
- •12. Что называется конструктором по умолчанию? Конструктором преобразования?
- •13. Основные свойства и правила использования конструкторов.
- •14. Деструктор. Вызов деструкторов (автоматический и явный).
- •15. Основные свойства и правила использования деструкторов.
- •16. Создание и уничтожение объектов.
- •17. Что такое наследование?
- •18. Понятия "базовый класс" и "производный класс"?
- •19. Принцип подстановки. Различие между понятиями "подкласс" и "подтип"?
- •20. Основные формы наследования?
- •21. Преимущества наследования?
- •22. Недостатки наследования?
- •23. Общая форма наследования классов? Спецификаторы доступа при наследовании?
- •24. Конструкторы и деструкторы производных классов? Порядок вызова конструкторов и деструкторов при множественном наследовании?
- •25. Множественное наследование. Общая форма?
- •26. Передача параметров в базовый класс. Назначение. Общая форма?
- •27. Указатели и ссылки на производные классы?
- •28. Виртуальная функция. Объявление виртуальной функции?
- •29. Чисто виртуальная функция. Общая форма чисто виртуальной функции?
- •30. Понятие "абстрактный класс".
- •31. Что такое полиморфизм? в каких формах он может существовать?
- •32. Понятие "перегрузка"?
- •33. Приведение типа. Неопределенность. Причины возникновения неопределенности и способы ее устранения?
- •34. Понятие "параметрическая перегрузка"?
- •35. Понятие "переопределение"? в чем заключается различие между перегрузкой и переопределением?
- •36. В чем заключается процесс уточнения?
- •37. Что такое шаблоны (или обобщенные функции)? Их назначение?
- •38. Функция-шаблон. Назначение функции-шаблона? Общий вид функции-шаблона?
- •39. Класс-шаблон. Общая форма класса-шаблона и экземпляра такого класса?
37. Что такое шаблоны (или обобщенные функции)? Их назначение?
Шаблон (обобщенные функции) используютсядля создания каркаса функции, оставляя компилятору реализацию подробностей.
Обобщенные функции работаютаналогично обычным функциям, но в отличие от обычных, реализуют необходимый алгоритм без задания конкретных числовых значений.
Используя обобщенные функции, можно создатьфункции-шаблоны и классы-шаблоны, для которых тип данных, которым оперирует эта функция или класс, является параметром, т е. можно использовать одну функцию или класс для нескольких различных типов данных без необходимости явного написания кода для каждой версии в отдельности.
38. Функция-шаблон. Назначение функции-шаблона? Общий вид функции-шаблона?
Функция-шаблонопределяет общий набор операций, который будет применен к данным различных типов.
Например, алгоритм быстрой сортировки совершенно одинаковый и для массива целых чисел, и для массива чисел с плавающей запятой. Отличается только тип данных, подлежащих сортировке.
При помощи создания функции-шаблона можно определить сущность алгоритма безотносительно к типу данных. После этого компилятор автоматически генерирует корректный код для того типа данных, для которого создается данная реализация, т. е. когда создается функция-шаблон, создается функция, которая может автоматически перегружать сама себя.
Функции-шаблоны создаются с использованием ключевого слова template(шаблон).
Общая форма функции-шаблона имеет следующий вид:
template <class параметр-тип> возвращаемый_тип имя_функции (список параметров)
{
. . . //тело функции
}
Где параметр-тип– это "держатель места" для имени типа данных, которое используется функцией. Параметр-тип может быть использован в определении функции. Но этот "держатель места" будет автоматически заменен компилятором на фактический тип данных во время создания конкретной версии функции.
Например, создадим функцию-шаблон, которая имеет два параметра и меняет между собой величины значений этих параметров.
# include <iostream.h>
// Х – шаблон типа, используемый в качестве параметра-типа. Далее объявляется функция
//swap(), использующая тип данных Х для параметров, которые будут обмениваться значениями
template <class Х> void swap (X &a, Х &b)
{
X temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int i=10, j=20;
float x=10.1, y=23.3;
char a='x', b='z';
cout<<"Первоначальные значения i, j: "<<i<<" "<<j<<endl;
cout<<" Первоначальные значения x, y: "<<x<<" "<<y<<endl;
cout<<" Первоначальные значения a, b: "<<a<<" "<<b<<endl;
swap(i, j);
swap(x, y);
swap(a, b);
cout<<"Измененные значения i, j: "<<i<<" "<<j<<endl;
cout<<" Измененные значения x, y: "<<x<<" "<<y<<endl;
cout<<" Измененные значения a, b: "<<a<<" "<<b<<endl;
return 0;
}
Функция swap() одинаково успешно будет работать для различных типов данных: целых чисел, чисел с плавающей точкой и символов.
Можно определить несколько типов-шаблонов данных в инструкции template, перечислив их через запятую.
Например, рассмотрим программу, реализующую переопределение функции maxдля аргументов различных типов, с использованием функции-шаблона:
#include<iostream.h>
#include<conio.h>
template <class Type1, class Type2> Type1 max(Type1 x, Type2 y)
{
return (x>y)?x:y;
}
// по шаблону типы аргументов должны быть одинаковыми,
// поэтому, для вариантов max(int, char) и max(char, int)
// нужно явно описать необходимые преобразования типов
char max(char, char);
void main(void)
{
int a=1, b=2;
char c='9', d='A';
clrscr();
cout<<max(a,b)<<" "<<max(c,d)<<" "<<max(a,c)<<" "<<max(c,b);
}