Не перегружаемые операторы C ++ - PullRequest
8 голосов
/ 20 мая 2010

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

Ответы [ 7 ]

17 голосов
/ 20 мая 2010

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

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

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

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

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

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

9 голосов
/ 20 мая 2010

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

<code><b>Operator Name                           Syntax</b>
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)
9 голосов
/ 20 мая 2010

С эта статья о перегрузке операторов

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

так

  • .
  • ?:
  • ::
  • .*
3 голосов
/ 20 мая 2010

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

.                       example: object.member_function()
.*                      example: object_reference.*member_function_ptr();
::                      example: some_name_space::function()
?:                      example: z = y > z ? y : z     (ternary operator)
3 голосов
/ 20 мая 2010
2 голосов
/ 20 мая 2010

Операторы ., :?, ::, .*, typeid и sizeof.

2 голосов
/ 20 мая 2010

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#faq-13.5

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

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