перегрузка операторов в C ++ - PullRequest
2 голосов
/ 19 сентября 2009

Кроме операторов new, delete, <<, & >>, какие еще операторы могут быть перегружены в C ++ вне контекста класса?

Ответы [ 2 ]

4 голосов
/ 19 сентября 2009

Следующие операторы (разделенные пробелом) могут быть перегружены как функции, не являющиеся членами:

new delete new[] delete[] + - * / % ˆ & | ˜ ! < > += -= *= /= %= ˆ=  
&= |= << >> >>= <<= == != <= >= && || ++ -- , ->* 

Следующие функции должны быть нестатическими функциями-членами:

-> () [] = 

следующее не может быть перегружено:

. .* :: ?: # ##

операторы преобразования также должны быть функциями-членами.

И то, что в нем есть «=», не означает, что его нельзя перегрузить какне член оператора.Следующее правильно сформировано:

struct A { };
A operator +=(A,A) { return A(); }
A a = A()+=A();

И операторы префикса и постфикса увеличения и уменьшения действительно могут быть определены как не-члены:

13.5.7 Определяемый пользователемФункция под названием operator ++ реализует оператор префикса и постфикса ++.Если эта функция является функцией-членом без параметров или не-функцией с одним параметром класса или типа перечисления, она определяет оператор приращения префикса ++ для объектов этого типа.Если функция является функцией-членом с одним параметром (который должен иметь тип int) или функцией, не являющейся членом, с двумя параметрами (второй из которых должен иметь тип int), она определяет оператор приращения постфикса ++ для объектовэтот тип.Когда приращение постфикса вызывается в результате использования оператора ++, аргумент int будет иметь значение ноль.
Операторы префикса и постфикса - обрабатываются аналогично

Пункт 13.5 вСтандарт охватывает это.

Надеюсь, это поможет.

4 голосов
/ 19 сентября 2009

Операторы, которые могут быть перегружены (запятая используется в качестве разделителя):

+, -, *, /, %, ^, &, |, ~, !, =, <, >, +=, -=, *=, /=, %=, ^=, &=, |=, >>=, <<=, !=, <=, >=, &&, ||, ++, --, ->* , (i.e., comma operator), ->, [], (), new[], delete[]

Операторы, которые не могут быть перегружены: ., .*, ::, ?:

Операторы, в которых функция перегрузки должна быть объявлена ​​как метод класса: (), [], ->, any assignment operator (как отметили комментаторы)

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