Image

Imagecpplang wrote in Imageprogrammist

Перегрузка операторов

Всем добрый день.
В одном тесте по C++ наткнулся на два таких вот вопроса:
Какие операторы разрешается перегружать только как фунции-члены класса?
Какие операторы не рекомендуется перегружать как фунции-члены класса?
С первым вопросом всё ясно - открываем Стандарт и смотрим.
А вот ответ на второй носит скорее рекомендательный характер нежели руководство к действию.
В результате поиска ответов познакомился с некоторыми любопытными рекомендациями, которые
и привожу ниже.

Интересно было бы получить на этот счёт ваши возражения, замечания, дополнения.

Правила
    Бинарный оператор можно определить либо в виде нестатической функции-члена с одним аргументом, 
либо функции-не-члена с двумя аргументами.
Унарный оператор можно определить либо в виде нестатической функции-члена без аргументов,
либо функции-не-члена с одним аргументом.

Ответы
Какие операторы разрешается перегружать только как фунции-члены класса?
Операторы operator=, operator[], operator(), operator-> могут быть только нестатическими функциями-членами.
Какие операторы не рекомендуется перегружать как фунции-члены класса?
Операции, в которых преобразование типов должно быть применено ко всем параметрам (операции смешанной арифметики),
не рекомендуется перегружать как фунции-члены класса.

Замечания
Операторная функция, у которой первый операнд принадлежит к встроеному типу, не может являться членом класса.
Запрещена перегрузка оператора функцией, которая в качестве входных параметров принимает значения только встроеных типов
(в Стандарте говорится:"Операторная функция ... должна содержать по крайней мере один параметр,
тип которого - класс, ссылка на класс, перечисление или ссылка на перечисление.").

Рекомендации
Целесообразно определять в классе бинарные операторы, модифицирующие значение первого аргумента, например, +=, *=.
Операторы ||, && и ,
Не рекомендуется перегружать операторы &&, ||, поскольку оптимизированная семантика (при которой вычисление выражения заканчивается,
как только установлена его истинность или ложность) заменяется на семантику вызовов функций.
Такая замена приводит к следующему:
- во-первых, вычисляются все аргументы, что уже само по себе не оптимально,
- во-вторых, Стандартом не определяется порядок вычисления аргументов функции;
это может повлечь за собой ошибки и, в любом случае, противоречит логике оптимизированной семантики.
По этой же причине не рекомендуется перегружать оператор ',' для которого сначала производится оценка выражения,
стоящего справа, а затем выражения, стоящего слева.