- 1、可重载的运算符
+
-
*
/
%
^
&
|
~
!
=
<
>
+=
-=
*=
/=
%=
^=
&=
|=
<<
>>
<<=< code> <code>>>=</code> <code>==</code> <code>!=</code> <code><=< code> <code>>=</code> <code>&&</code> <code>||</code> <code>++</code> <code>--</code> <code>,</code> <code>->*</code> <code>-></code> <code>()</code> <code>[]</code> <code>new</code> <code>new[]</code> <code>delete</code> <code>delete[]</code><!--=<--></code><!--=<-->
- 2、只能是成员函数重载运算符的
=
:只有形同的类型的才可以赋值,所以 左值和 右值必须是同一类型。()
:函数调用运算符。[]
:下标运算符。-
->
:指针调用运算符。 -
3、重载不能改变运算符的优先级和结合性
乘法的优先级仍然高于加法,并且它们仍然是二元运算符。
- 4、重载不会改变运算符的用法
原有有几个操作数、操作数在左边还是在右边,这些都不会改变。例如~号右边只有一个操作数,+号总是出现在两个操作数之间,重载后也必须如此。
例如,下面这样是不对的:
int operator + (int a,int b){
return (a-b);
}
+
号原来是对两个数相加,现在企图通过重载使它的作用改为两个数相减, 如果允许这样重载的话,那么表达式 4+3的结果是 7 还是 1 呢?显然,这是绝对禁止的。
如果有两个参数,这两个参数可以都是对象,也可以一个是对象,一个是C ++内置类型的数据,例如:
complex operator+(int a, complex &c){
return complex(a+c.real, c.imag);
}
它的作用是使一个整数和一个复数相加。
另外,将运算符重载函数作为全局函数时,一般都需要在类中将该函数声明为 友元函数。原因很简单,该函数大部分情况下都需要使用类的 private
成员。
- 5、运算符重载函数不能有默认的参数
否则就改变了运算符操作数的个数,这显然是错误的。
- 6、运算符重载函数既可以作为类的成员函数,也可以作为全局函数。
- 成员函数:将运算符重载函数作为类的成员函数时,二元运算符的参数只有一个,一元运算符不需要参数。之所以少一个参数,是因为这个参数是隐含的。
- 全局函数:将运算符重载函数作为全局函数时,二元操作符就需要两个参数,一元操作符需要一个参数,而且其中必须有一个参数是对象,好让编译器区分这是程序员自定义的运算符,防止程序员修改用于内置类型的运算符的性质。
Original: https://www.cnblogs.com/burner/p/zhong-zai-gui-ze.html
Author: 浪客禅心
Title: 重载规则
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607473/
转载文章受原作者版权保护。转载请注明原作者出处!