Unoverloadable операторы C++

Какие операторы не могут быть перегружены в C++?

8
задан Peter Mortensen 20 August 2010 в 23:11
поделиться

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)
9
ответ дан 5 December 2019 в 04:39
поделиться

. , .*, ?:, ::, sizeof, и typeid. (from http://en.wikipedia.org/wiki/C%2B%2B_operators#Other_operators)

3
ответ дан 5 December 2019 в 04:39
поделиться

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

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

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

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

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

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

17
ответ дан 5 December 2019 в 04:39
поделиться

Следующие операторы не могут быть перегружены в 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
ответ дан 5 December 2019 в 04:39
поделиться

. , :? , ::, .*, typeid и sizeof.

2
ответ дан 5 December 2019 в 04:39
поделиться

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

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

так

  • .
  • ?:
  • ::
  • . *
9
ответ дан 5 December 2019 в 04:39
поделиться

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 ++ добавляет несколько собственных операторы, большинство из которых могут быть перегружен, кроме :: и. *.

2
ответ дан 5 December 2019 в 04:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: