Какие операторы не могут быть перегружены в C++?
Из Википедии:
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)
.
, .*
, ?:
, ::
, sizeof
, и typeid
. (from http://en.wikipedia.org/wiki/C%2B%2B_operators#Other_operators)
Я почти уверен, что C++ FAQ Lite, вероятно, охватывает это. Из тех, о которых я могу сразу вспомнить, это троичный оператор, оператор .
и оператор разрешения области видимости (::
). Подумав немного, поскольку оператор .
оператор не может быть перегружен, .*
, вероятно, тоже не может.
Есть также некоторые операторы, которые могут, но почти никогда не должны быть перегружены, включая оператор запятой, &&
, ||
, все из которых обычно создают точку следования. Операторы &&
и ||
также (обычно) оценивают только правый операнд, если это необходимо. Ни одна из этих характеристик не относится к перегруженному оператору.
Хотя для этого есть несколько причин, перегрузка унарного оператора &
(address-of) также часто является довольно плохой идеей. Адрес объекта в значительной степени приравнивается к его идентификатору, поэтому его перегрузка может затруднить выполнение многих других задач.
Edit: что касается оценки правого операнда только в случае необходимости (она же "оценка по короткому замыканию"): рассмотрим что-нибудь вроде x && y
. Выражение может быть истинным только в том случае, если истинен левый операнд. Если левый операнд оценивается как false
, то выражение также должно быть ложным, и C (и C++) гарантирует, что правый операнд not вообще не будет оценен. Это удобно (например), если вы хотите сделать что-то вроде if (ptr != NULL && ptr->member /*...*/ )
. В этом случае, если указатель в NULL, выполнение останавливается, и вы никогда не пытаетесь разыменовать указатель.
Та же основная идея справедлива для ||
, но в обратном порядке. В этом случае, если левый операнд оценивается в true
, то выражение в целом должно быть true
, независимо от того, во что оценивается правый операнд, поэтому (опять же) C и C++ гарантируют, что в этом случае правый операнд не будет оценен.
Однако, когда вы перегружаете эти операторы, оценка выражения all всегда будет оценивать оба операнда. Первое выражение попытается разыменовать указатель, даже если это нулевой указатель, что приведет к неопределенному поведению.
Следующие операторы не могут быть перегружены в C++:
. example: object.member_function()
.* example: object_reference.*member_function_ptr();
:: example: some_name_space::function()
?: example: z = y > z ? y : z (ternary operator)
Из этой статьи о перегрузке операторов
Большинство из них может быть перегружено. Единственные операторы C, которых не может быть, - это. и?: (и sizeof, который технически является оператором). C ++ добавляет несколько собственных операторов, большинство из которых могут быть перегружены, кроме :: и. *.
так
.
?:
::
. *
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 ++ добавляет несколько собственных операторы, большинство из которых могут быть перегружен, кроме :: и. *.