Оператор C ++ * уже перегружен? - PullRequest
9 голосов
/ 23 августа 2011

Мой учитель C ++ считает, что оператор * в стандартном C ++ "уже перегружен", потому что это может означать косвенное или умножение в зависимости от контекста. Он получил это от C ++ Primer Plus , в котором говорится:

На самом деле, многие операторы C ++ (и C) уже перегружены. Например, оператор * при применении к адресу возвращает значение, хранящееся по этому адресу. Но применение * к двум числам дает произведение значений. C ++ использует количество и тип операндов, чтобы решить, какое действие предпринять. (стр. 502, 5-е изд.)

По крайней мере, еще один учебник говорит о том же. Насколько я могу сказать, это не так; унарный * - это оператор, отличный от двоичного *, и механизм, с помощью которого компилятор устраняет их неоднозначность, не имеет ничего общего с перегрузкой операторов.

Кто прав?

Ответы [ 3 ]

12 голосов
/ 23 августа 2011

Оба вопроса верны, поскольку вопрос зависит от контекста и значения слова перегрузка.

«Перегрузка» может принимать общее значение «один и тот же символ, другое значение» и разрешать любое использование «*», включая косвенное и умножение, и любое пользовательское поведение.

«Перегрузка» может использоваться для применения к официальной функциональности C ++ по перегрузке операторов, в этом случае косвенность и умножение действительно различны.

ADDENDUM : См. Комментарий Стива ниже о «переоценке оператора» по сравнению с « токеном перегрузкой».

2 голосов
/ 23 августа 2011

Я верю, что вы есть. Разыменование оп и мульт. оп разные операторы, даже если написаны одинаково. То же самое касается +, -, ++, - и любых других, которые я мог забыть.

Я полагаю, что в книге в этом параграфе слово «перегружено» означает «используется более чем одним способом», но не пользователем. Таким образом, вы также можете считать книгу правильной ... также зависит от того, имеете ли вы в виду перегрузку оператора * или оператора умножения (например).

1 голос
/ 23 августа 2011

Он перегружен в том смысле, что один и тот же символ используется для обозначения разных вещей в разных местах (например, разыменование указателя, умножение между int s, умножение на другие встроенные типы и т. Д.).

Обычно, однако, «перегрузка оператора» относится к определению оператора (который имеет тот же символ, что и встроенный), используя пользовательский код , чтобы он делал что-то интересное для пользователя определенный тип .

Итак ... вы оба правы: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...