Не перегружаемые операторы C++

Какие операторы нельзя перегружать в C++?

7 ответов

Решение

Из Википедии:

Operator Name                           Syntax
Bind pointer to member by reference     a.*b
Member                                  a.b
Scope resolution                        a::b
Size of                                 sizeof(a)
Ternary                                 a ? b : c
Type identification                     typeid(a)

Я уверен, что C++ FAQ Lite, вероятно, покрывает это. Те, о которых я могу сразу подумать, это троичный оператор, . оператор и оператор разрешения области видимости (::). Подумав минуту, так как . оператор не может быть перегружен, .* вероятно, тоже не может быть.

Есть также некоторые операторы, которые могут, но почти никогда не должны быть перегружены, включая оператор запятой, &&, ||Все из которых обычно создают точку последовательности. && а также || также только (обычно) оценивают правильный операнд при необходимости. Ни одна из этих характеристик не относится к перегруженному оператору.

Хотя для этого есть несколько причин, перегрузка & Оператор (address-of) также часто является довольно плохой идеей. Адрес объекта в значительной степени приравнивается к его идентичности, поэтому его перегрузка может сделать довольно много других вещей относительно трудными.

Редактировать: что касается оценки правого операнда только в случае необходимости (он же "Оценка короткого замыкания"): рассмотреть что-то вроде x && y, Выражение может быть истинным, только если левый операнд истинен. Если левый операнд оценивается как false, тогда выражение также должно быть ложным, и C (и C++) гарантируют, что правильный операнд не будет оцениваться вообще. Это удобно (например), если вы хотите сделать что-то вроде if (ptr != NULL && ptr->member /*...*/ ), В этом случае, если указатель в NULL, выполнение останавливается, и вы никогда не пытаетесь разыменовать указатель.

Та же самая основная идея верна с ||, но в обратном порядке. В этом случае, если левый операнд оценивается как trueто выражение в целом должно быть trueнезависимо от того, что правильный операнд будет вычислять, чтобы (опять же) C и C++ гарантировали, что в этом случае правильный операнд не будет оцениваться.

Однако, когда вы перегружаете эти операторы, при оценке выражения все всегда будут оцениваться оба операнда. Первое выражение будет пытаться разыменовать указатель, даже если это нулевой указатель, поэтому он будет давать неопределенное поведение.

Из этой статьи о перегрузке операторов

Большинство может быть перегружено. Единственные операторы C, которые не могут быть. и?: (и sizeof, который технически является оператором). C++ добавляет несколько своих собственных операторов, большинство из которых могут быть перегружены, кроме:: и.*.

так

  • .
  • ?:
  • ::
  • .*

Следующие операторы не могут быть перегружены в C++:

.                       example: object.member_function()
.*                      example: object_reference.*member_function_ptr();
::                      example: some_name_space::function()
?:                      example: z = y > z ? y : z     (ternary operator)

., .*, ?:, ::, sizeof, а также typeid, (с http://en.wikipedia.org/wiki/C%2B%2B_operators)

., :?, ::, .*, typeid а также sizeof операторы.

GIYF: http://www.google.com/search?q=What+operators+can+not+be+overloaded+in+c%2B%2B%3F

Первый результат:

http://www.parashift.com/c++-faq-lite/operator-overloading.html

Большинство может быть перегружено. Единственные операторы C, которые не могут быть. и?: (и sizeof, который технически является оператором). C++ добавляет несколько своих собственных операторов, большинство из которых могут быть перегружены, кроме:: и.*.

Другие вопросы по тегам