- •Конспект по "Объектно-ориентированному программированию".
- •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. Класс-шаблон. Общая форма класса-шаблона и экземпляра такого класса?
33. Приведение типа. Неопределенность. Причины возникновения неопределенности и способы ее устранения?
Приведение типа– это преобразование значения одного типа в значение другого.
Например, рассмотрим принцип работы оператора сложения "+". Этот оператор с одинаковым успехом используется для сложения, как целых, так и вещественных чисел. Код, генерируемый компилятором при сложении целых чисел, часто коренным образом отличается от кода с плавающей точкой. Но программист думает об этих операциях как о единой функции "сложение". Если в данном примере разрешить арифметические действия со смешанными операндами, то сложение двух значений может интерпретироваться несколькими способами:
– разрешено использование четырех различных функций, которые соответствуют операциям "целое + целое", "целое + вещественное", "вещественное + целое", "вещественное + вещественное". В этом случае есть перегрузка, но нет приведения типа;
– разрешено использование двух различных функций: "целое + целое" и "вещественное + вещественное". Для операций "целое + вещественное" и "вещественное + целое" целое значение должно быть приведено к вещественному. В таком случае присутствует комбинация перегрузки и приведения типа;
– есть только одна функция сложения: "вещественное + вещественное". Все аргументы приводятся к типу данных "вещественное число". В этом случае нет перегрузки, а есть только приведение типов.
При выполнении операции приведения типа может возникнуть неопределенность – ситуация когда компилятор не может сделать выбор между перегруженными функциями.
Неопределенные инструкции являются ошибками, и программа, содержащая неопределенности, не будет откомпилирована.
Основная и наиболее распространенная причина возникновения неопределенностей – вызов функции с одновременным автоматическим преобразованием типов.
Ошибка вызываетсяне автоматическим преобразованием типа, а особенностями вызова функции.
С++ автоматически пытается преобразовать аргументы, использованные при вызове функции, к типу аргументов интерфейса функции.
Например:
#include<iostream.h>
float myfunc(float i); // объявление функции myfunc() для значений типа float
double myfunc(double i); // объявление функции myfunc() для значений типа double
int main()
{
cout<<myfunc(10.1)<<" "; // автоматическое преобразование числа 10.1
// к типу double и вызов функции myfunc(double i)
cout<<myfunc(10)<<" "; // неопределенная ситуация
return 0;
}
float myfunc(float i)
{
return i;
}
double myfunc(double i)
{
return -i;
}
В данном примере функция myfunc()перегружена и может в качестве аргументов использовать переменные типаfloat или double.
Вызов функции со значением 10.1 не вызывает неопределенности, так как С++ автоматически преобразовывает его к типу doubleи вызывается функцияmyfunc(double i).
Но когда функция вызывается со значением 10, возникает неопределенность, так как компилятор не может определить, к какому типу преобразовать это число. Программа не компилируется и выдается сообщение об ошибке.
Чтобы снять неопределенность достаточно число 10 заменить числом 10.0
Другой причиной возникновения неопределенности может быть использование в перегруженных функциях аргументов по умолчанию.
Например:
#include <iostream.h>
#include <conio.h>
int myfunc(int i);
int myfunc(int i, int j=1);
int main()
{
clrscr();
cout<<myfunc(4, 5)<<" "; // неопределенности нет
cout<<myfunc(10); // неопределенность
return 0;
}
int myfunc(int i)
{
return i;
}
int myfunc(int i, int j)
{
return i*j;
}
В данном примере при вызове функции myfunc(4, 5) неопределенности не возникает, так как здесь указываются два аргумента.
Но когда вызывается функция myfunc(10), возникает неопределенность, так как компилятор не знает, вызывать ли функциюmyfunc() с одним аргументом, или использовать функцию с двумя аргументами, у которой второй аргумент принимает значение по умолчанию.
Чтобы снять неопределенность, нужно явно указать второй аргумент.