- •Вопрос 4. Деревья синтаксического анализа.
- •Генерация дерева синтаксического анализа
- •Вопрос 5. Приоритет операторов. Ассоциативность операторов.
- •Вопрос 6. Расширенная форма Бэкуса-Наура и синтаксические графы.
- •Вопрос 10. Концепция связывания, способы связи переменных с памятью
- •Вопрос 11. Арифметические выражения, порядок вычисления операторов.
- •Вопрос 12. Перегруженные операторы
- •Вопрос 13. Преобразование типов.
- •Вопрос 15. Операторы присваивания.
- •Вопрос 16.Структура операторов управления. Составной оператор и оператор ветвления (2 варианта).
- •Вопрос 14. Отношения и булевские выражения. Сокращенные вычисления.
- •Вложенные операторы ветвления и замыкание операторов ветвления.
- •I. Вложенные операторы ветвления.
- •Многовариантные операторы ветвления.
- •Вопрос 19. Операторы цикла. Циклы со счетчиком. Оператор do в Fortran. Оператор цикла в Pascal, algol 60.
- •Вопрос 21. Логически управляемые циклы.
- •Вопрос 22. Циклы с механизмом управления, размещаемым пользователем.
Вопрос 12. Перегруженные операторы
Перегрузка оператора состоит в изменении смысла оператора (например, оператора плюс (+), который обычно в C++ используется для сложения) при использовании его с определенным классом.
1. Операторы перегружаются только для пользовательских типов (исключение - глобальные new и delete).
2. Нельзя изобрести новые операторы
3. Нельзя сделать бинарный оператор унарным, или поменять приоритеты операций.
4. Некоторые операторы вообще нельзя перегружать, и они сразу доступны для объектов класса. Для некоторых автоматически предоставляется вариант по умолчанию (если вы не написали свой) Но в большинстве своем операторы сначала должны быть созданы (написаны) для класса, и только после этого их можно использовать.
5. Когда речь идет о встроенных типах данных, вы в некоторых случаях можете ожидать одинаковых результатов от разных выражений (i=i+j; i+=j;). Когда речь заходит о классах, обеспечение подобной эквивалентности лежит на ваших плечах (вы должны написать одинаковое поведение для операторов + и +=). Из той же оперы - если вы хотите выразить один оператор через другой - вы должны сделать это явно.
6. Операторы перегружаются либо в виде функций-членов (то есть, методов класса), либо в виде дружественных функций. Однако некоторые по правилам языка могут быть реализованы только в виде функций-членов (например, оператор присваивания). Также бывают противоположные ситуации - приходится использовать не член-функцию: а дружественную. Правда, в последнем случае это требование накладывается не самими правилами языка, а имеющимся в распоряжении набором классов (как, например, в случае операторов ввода-вывода >> и <<).
7. Очень немного операторов жестко требуют какого-то определенного типа возвращаемого значения. В большинстве своем вы абсолютно свободны в выборе типа результата. Однако правила языка и контекст использования операторов зачастую дают рекомендации на тип значения (так, например, желательно, чтобы оператор присваивания возвращал тот же тип, что и у своего объекта).
8. Вовсе необязательно делать одну функцию на оператор. Можно сделать на каждый оператор сколько угодно функций, лишь бы они различались по сигнатуре. Только не забывайте, что тип результата не входит в сигнатуру.
9. Нельзя задавать значения по умолчанию для параметров в операторах.
C++ позволяет перегружать большинство операторов, за исключением четырех перечисленных:
. Выбор элемента object.member
.* Указатель на элемент object.*member
:: Разрешение области видимости classname::member
?: Условный оператор сравнения с = (а > b) ? а : b;
Вопрос 13. Преобразование типов.
Преобразование (приведение) типа— это преобразование значения одного типа в значение другого типа.
Преобразование типов бывает:
Сужающее - преобразование величины в тип, который не содержит даже приблизительных значений исходного типа. (Пример: float в double)
Расширяющее – преобразование величины в тип, содержащий как минимум все приближенные всех значений. (Пример: int в float)
Выделяют приведения типов:
Явное приведение задаётся программистом в тексте программы с помощью:
конструкции языка;
функции, принимающей значение одного типа и возвращающей значение другого типа.
Пример: AVG:=float(Sum)/float(Quant)
2. Неявное приведение выполняется транслятором (компилятором или интерпретатором) по правилами, описанным в стандарте языка.
