重载运算符操作说明(一)

重载的运算符有特殊的名字的函数:
重载运算符名字由关键字operator 和其后要定义的运算符号共同组成。
重载的运算符也包含返回类型参数列表,以及函数体
重载运算符函数的参数数量与该运算符作用的运算对象数量一样多。比如 一元运算符有一个参数,二元运算符有两个参数。
注意·:
除了重载的函数调用运算符operator()之外,其它重载运算符不能含有默认参数。

关于 成员运算符函数的(显式)参数数量比运算符的运算对象总数少一个 的原因是
第一个左侧运算对象绑定到隐式的 this 指针上。
当运算符作用于内置类型的运算对象时,我们无法改变该运算符的含义
例:
int operator+(int , int);//错误,不能为int 重定义内置运算符
总结:只能重载已有的运算符,无权发布新的运算符号。
±*&既是一元运算符,也是二元运算符,所有这些运算符都能被重载。

下面是总结的一些是否能被重载运算符:
重载运算符操作说明(一)_第1张图片
使用重载的运算符本质上是一次函数调用
所以这些关于运算对象求值顺序规则无法应用到重载的运算符上
一般不重载逗号运算符取地址运算****符
因为这两种运算符已经有了内置的含义
如果重载一般它们的行为将异于常态 从而导致类的用户无法适应。
明智的使用重载运算符
运算符重载 每个运算符在用于内置类型时都有比较明确的含义。
当在内置的运算符和我们自己的操作之间存在逻辑映射关系时,运算符重载的效果最好。
过分滥用运算符重载也会使我们的类变得难以理解。
例如
把operator+定义并让它执行 减法操作 就非常的不友好了。
只有当操作的含义对于用户来说清晰明了时才使用运算符。
如果用户对运算符可能有几种不同的理解,则使用这样的运算符将产生二义性。

赋值和复合赋值运算符赋值运算符的行为与复合版本的类似

:赋值之后,左侧运算对象和右侧运算对象的值相等,并且运算符应该返回它左侧运算对象的一个引用。
重载的赋值运算应该继承而非违背其内置版本的含义。
如果类含有算术运算符则最好也提供对应的复合赋值运算符。
当我们定义运算符时,必须首先判断成员函数还是普通的非成员函数,决定是将其声明为类的成员函数还是声明为一个普通的非成员函数。

下面的准则有助于我们在将运算符定义为成员函数还是普通的非成员函数做出抉择:

●赋值(=)、下标([])、调用(l)和成员访问箭头(->)运算符必须是成员。复合赋值运算符一般来说应该是成员,但并非必须,这一点与赋值运算符不同。
●改变对象状态的运算符或者与给定类型密切相关的运算符,如递增、递诚和解引用运算符,通常应该是成员。
●具有对称性的运算符可能转换任意一端的运算对象,例如算术、相等性、关系和位运算符等,因此它们通常应该是普通的非成员函数。

你可能感兴趣的:(c++,开发语言)