Кто-то недавно спросил меня различие между оператором стандарта C++ (например, новый, удалите, sizeof), и функция (например, коричневый, свободный, malloc). По "стандарту" я имею в виду обеспеченных по умолчанию пакетом компилятора, и не определяемый пользователем. Ниже были ответы, которые я дал, хотя ни один не казался удовлетворительным.
(1) Для оператора не нужны никакие заголовки, которые будут включены для использования его: Например, у Вас может быть вызов к новому без включения любых заголовков. Однако для функции (говорят свободный ()) действительно нужны включенные заголовки, обязательно.
(2) Оператор определяется как таковой (т.е. как оператор класса) где-нибудь в стандартных заголовках. Функция не.
Действительно ли можно ли критиковать эти ответы и дать ли мне лучшее представление о различии?
Операторы - это ключевые слова с фиксированным синтаксисом. Те, которые могут быть перегружены, могут немного отличаться по синтаксису, но это в пределах границ. Оператор new
по-прежнему пишется new
, даже если он перегружен, и синтаксис его вызова всегда одинаков.
Имена функций - это идентификаторы, которые могут быть почти произвольными. Нет синтаксической причины, по которой вы не могли бы отказаться от malloc()
и использовать
bool my_fancy_alloc(void*& memory, unsigned char size, bool zero_it);
вместо нее. (Марк: Однако есть и другие причины. Например, здравомыслие ваших коллег по работе).
У операторов есть особый синтаксис, например вы можете использовать new
(или +
), не заключая аргументы в скобки после имени оператора.
(1) не совсем верно. typeid
- это оператор, но его использование требует, чтобы вы включили
.
Мой ответ был бы прост: операторы определяются как. ::
, например, не обязательно должен считаться оператором, но стандарт говорит, что это так, и так оно и есть.
Если вы ищете более многословный ответ, я бы продолжил, упомянув, что операторы в основном не выглядят как функции. А те, что выглядят [sizeof
и typeid
], не действуют как функции; их операнды не оцениваются во время выполнения.
, насколько я понимаю, имя функции является представлением оператора goto, после перехода к конкретному местоположению кода приложение может выполнять от одной до многих единиц работы, с другой стороны, оператор выполняет фактическую единицу работы Работа.