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