- •Понятия объекта, класса объектов.
- •2. Основные понятия ооп: инкапсуляция, наследование и полиморфизм.
- •Модульное программирование.
- •4. Нисходящее программирование
- •5. Структурное програММирование
- •6. Прототипы функций.
- •7. Перегрузка функций
- •8. Значения формальных параметров по умолчанию.
- •9. ССылка и параметры-сСылки
- •10. Встраиваемые функцИи
- •11. ОперацИи new и delete
- •12. ФункцИи-члены и даННые-члены
- •13. Интерфейсы и реализация
- •14. Конструкторы и инициализация
- •15. Конструктор без параметров (по умолчанию)
- •16. Деструкторы и очистка
- •17. Конструктор копирования
- •18. Указатель this
- •19. Статические члены: функции и данные.
- •20. Указатели на члены.
- •21. Структуры и объединения
- •22. Константные члены-функции и константные объекты.
- •Void f();
- •Перегрузка бинарных и унарных операций.
- •Перегруженные операции индексирования, вызова функций, инкремента и декремента префиксных и постфиксных.
- •Перегрузка new, delete
- •Преобразование типов, определяемых пользователем с помощью конструкторов и операций преобразования.
- •Неявное преобразование типов
- •30. Наследование клаССов и производные клаССы.
- •31. Конструкторы, деструкторы и наследование.
- •Множественное наследование
- •Виртуальные базовые классы.
- •Virtual void draw();
- •Виртуальные функции.
- •35. Полиморфизм.
- •36. Абстрактные клаССы и чистые виртуальные функцИи.
- •37. Заголовочные файлы.
- •38. ПредопределЁнНые объекты и потоки.
- •39. Ошибки потоков.
- •41. Конструкторы файловых потоков.
- •42. Открытие файлов в разных режимах.
- •43. ВВод-вывод в файлы.
- •44. Шаблоны функций.
- •45. Параметры шаблонов.
- •46. Шаблоны клаССов.
Преобразование типов, определяемых пользователем с помощью конструкторов и операций преобразования.
Зачем нам вообще необходимы явные преобразования? Для тех случаев, когда у нас компилятор сам не может преобразовать типы (при этом возникает ошибка). Давайте более подробно рассмотрим такие ситуации:
Преобразование int в short – если число с типом данных int слишком большое, то при преобразовании в short потеряются некоторые данные;
Преобразование int в uint и uint в int – такая же причина;
Преобразование float в int – логично, что потеряются все данные, которые находились после запятой;
Преобразование любых числовых типов в char – ясно, что тут будут потеряны все данные.
Логично, что компилятор понимает, что в таких случаях могут быть ошибки программиста, поэтому данные преобразования не проводит – генерирует ошибки. Но сам программист может заставить компилятор провести такое приведение типов, используя приведения (costs):
Long znach = 12345;
Int I = (int)zhach;
Здесь в скобки заключаем тот тип, к которому необходимо привести значение, которое приводится после скобок. Если вдруг значение переменной znach будет очень большим (то есть – больше, чем максимально возможное в типе int), при явном преобразовании компилятор ошибки не выдаст (понадеется на программиста), а вы потеряете данные.
Для того, чтобы все-таки ошибка появлялась в том случае, если переменная имеет слишком большое значение, необходимо использовать специальную операцию, которую так и называют – проверка (то есть checked):
Long zhack 1234567890;
Int I = checked((int)znach);
Так как явное преобразование типов не всегда может завершиться удачно, такая операция, как checked позволяет программистам своевременно выполнять проверку таких преобразований.
Явное преобразование типов – это мощный механизм, с помощью которого можно преобразовать почти все типы данных друг в друга. Но таким механизмом нельзя преобразовать тип данных bool (логический тип) ни в какой другой тип данных.
Еще просто пример на С# явного преобразования:
class Test
{
static void Main()
{
double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
System.Console.WriteLine(a);
}
}
// Output: 1234
Неявное преобразование типов
При неявном приведении преобразование типов происходит автоматически, по правилам, заложенным в данном языке программирования. Не требуется никакого специального синтаксиса, поскольку преобразование безопасно для типов и данные не теряются. Примерами могут служить преобразования от меньшего к большему целому типу, и преобразования из производных классов в базовые классы. Для встроенных числовых типов неявное преобразование можно выполнить, сохраняемое значение может уместиться в переменной без обрезания или округления до ближайшего. Например, переменная типа long (8-байтное целое) может хранить любое значение, которое может хранить int (4 байта в 32-разрядном компьютере). В следующем примере компилятор неявно преобразует значение справа в тип long перед присвоением его типу bigNum.
int num = 2147483647;
long bigNum = num;
Полный список всех неявных числовых преобразований: