- •Конспект по "Объектно-ориентированному программированию".
- •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. Класс-шаблон. Общая форма класса-шаблона и экземпляра такого класса?
34. Понятие "параметрическая перегрузка"?
Параметрической перегрузкойназывается перегрузка при которой процедурам (функциям, методам) в одном и том же контексте разрешается использовать совместно одно имя, а двусмысленность снимается за счет анализа числа и типов аргументов.
В С++ любой метод функция, процедура или оператор могут быть параметрически перегруженными, если их аргументы таковы, что выбор можно произвести однозначно на этапе компиляции. Например, автоматическое приведение типа от символьных значений к целым числам или от целых – к числам с плавающей точкой.
35. Понятие "переопределение"? в чем заключается различие между перегрузкой и переопределением?
Переопределение (или чистый полиморфизм) – это ситуация, когда одна и та же функция применяется к аргументам различных типов, т. е. в случае переопределения есть одна функция (тело кода) и несколько ее интерпретаций.
Перегрузка является обязательной частью переопределения методов, но переопределение методов может происходить без перегрузки.
Переопределение методов вносит свой вклад в совместное использование кода, так как экземпляры классов, которые не переопределяют данный метод, могут использовать одну копию оригинального кода.
В тех случаях, когда метод не подходит, создается альтернативный фрагмент кода.
Производные классы автоматически перенимают все то, что обеспечивает базовый класс. Например, если класс "Лодка" определяет метод "Поставить в док", то производные классы автоматически наследуют его. Если же есть необходимость, то можно в производных классах переопределить реализацию метода требуемым образом. Например, переопределить метод "Поставить в док" для класса "Подводная лодка" Если во время выполнения в программе присутствует указатель на объект типа "Лодка" (а это базовый тип), этот указатель может ссылаться как на парусную или моторную лодку, так и на подводную
36. В чем заключается процесс уточнения?
Процесс, в ходе которого компилятор по типу фактических параметров определяет, какую именно функцию требуется вызвать, называется уточнением.
Тип возвращаемого функцией значения в уточнении не участвует.
Например, имеется 4 варианта функции max, определяющей наибольшее из двух значений:
– int max(int, int); // возвращает наибольшее из целых чисел
– char* max(char*, char*); // возвращает подстроку наибольшей длины
– int max(int, char*); // возвращает наибольшее из первого параметра и длины второго
– int max(char*, int); // возвращает наибольшее из второго параметра и длины первого
Рассмотрим программу, реализующую переопределение функции maxдля аргументов различных типов:
#include <iostream.h>
#include <string.h>
#include <conio.h>
int max(int, int);
char* max(char*, char*);
int max(int, char*);
int max(char*, int);
void f(int a, int b, char *c, char *d)
{
cout<<max(a,b)<<" "<<max(b,d)<<" "<<max(a,c)<<" "<<max(c,d);
}
void main(void)
{
int a=10, b=2;
char c[]="Hi", d[]="Low";
f(a, b, c, d);
}
int max(int value1, int value2)
{
return ( (value1 > value2) ? value1 : value2);
}
int max(int value1, char *value2)
{
return ( (value1 > strlen(value2)) ? value1 : strlen(value2));
}
int max(char *value1, int value2)
{
return ( (strlen(value1) > value2) ? strlen(value1) : value2);
}
char* max(char *value1, char *value2)
{
return ( (strlen(value1) > strlen(value2)) ? value1 : value2);
}
void f(int a, int b, char* c, char* d)
{
cout<<max(a,b)<<max(c,d)<<max(a,c)<<max(c,b);
}
При вызове функции maxкомпилятор выбирает соответствующий типу параметра вариант функции. В данном примере последовательно вызываются все четыре варианта функции.
Если точного соответствия не найдено, выполняются продвижения порядковых типов в соответствии с общими правилами преобразования типов.
Далее выполняются стандартные преобразования типов.
Затем выполняются преобразования типа, заданные пользователем, а также поиск соответствий за счет переменного числа аргументов функций.
Если соответствие на одном и том же этапе может быть получено более чем одним способом, вызов считается неопределенным и выдается сообщение об ошибке.
Для устранения неопределенности можно воспользоваться явным приведением типа.