Если вы сравниваете перегрузку операторов между Java и C ++, вы не будете говорить о new
и delete
- Java не предоставляет достаточно подробностей управления памятью для новых и не нуждается в удалении.
Вы не можете перегружать другие операторы для типов указателей - по крайней мере один аргумент должен быть классом или перечислимым типом, поэтому он не может говорить о предоставлении различных операторов для указателей.
Таким образом, операторы в C ++ работают со значениями или постоянными ссылками на значения.
Было бы очень необычно для операторов, которые оперируют со значениями или постоянными ссылками на значения, возвращать что-либо кроме значения.
Помимо очевидных ошибок, общих для всех функций C ++ - возвращение ссылки на объект, выделенный из стека (что противоположно утечке памяти), или возврат ссылки на объект, созданный с помощью new
, а не значения (которое обычно делается не чаще, чем один раз в карьере, прежде чем учиться), было бы трудно придумать сценарий, когда у общих операторов возникают проблемы с памятью.
Таким образом, нет необходимости создавать несколько версий в зависимости от того, выделяются ли операнды в стеке или в куче на основе обычных шаблонов использования.
Аргументами для оператора являются объекты, переданные в виде значений или ссылок. В C ++ нет переносимого механизма для проверки того, был ли объект выделен в куче или стеке. Если объект был передан по значению, он всегда будет в стеке. Таким образом, если бы требовалось изменить поведение операторов для двух случаев, это было бы невозможно сделать в C ++. (во многих ОС вы можете проверить, находится ли указатель на объект в пространстве, обычно используемом для стека, или в пространстве, обычно используемом для кучи, но это не является ни переносимым, ни полностью надежным.) (также, даже если у вас могут быть операторы в котором в качестве аргументов использовались два указателя, нет никаких оснований полагать, что объекты выделяются кучей только потому, что они являются указателями. Эта информация просто не существует в C ++)
Единственное дублирование, которое вы получаете, относится к случаям, таким как operator [], где один и тот же оператор используется и как метод доступа, и как мутатор. Тогда нормально иметь const и неконстантную версию, поэтому вы можете установить значение, если получатель не является const. Это хорошо - неспособность видоизменять (общедоступное состояние) объекты, помеченные как постоянные.