C++中重载运算符
注意事项:
- 重载运算符函数要求必须有一个参数为类对象.
- 重载运算符函数不可以有默认参实参.(
operator()
除外) - 重载运算符函数的参数个数与运算符作用的运算对象数量相同, 对于二元运算符来说,左侧运算符对象传递给第一个参数,右侧运算符对象传递给第二个参数.
- 重载之后的运算符本质上就是一个函数调用, 原生运算符的求值顺序以及运算符的短路属性并不会保留下来.
C++中哪些运算符可以重载?
大多数运算符都可以重载,有4个运算符不可以重载. 分别是: 作用域运行符::
/成员访问运算符.
/成员访问指针运算符.*
(c++primer第7339页)/三目运算符? :
.
哪些运算符应该作为类成员函数进行重载?
- 5个运算符必须作为类成员函数进行重载: 赋值运算符
=
/下标运算符[]
/箭头运算符->
/函数调用运算符()
, 以及类型转换运算符. - 改变对象状态的运算符以及与给定类型非常相关的运行符,建立写为类成员运算符. 例如: 复合赋值运算符/
++
或--
运算符/解引用运算符*
等. - 具有对称性的运算符通常为普通的非成员运算符, 例如: 关系/相等/算术运算符等.
- 输入输出运算符(
>>
和<<
)必须是普通的非类成员函数,因为:如果是类成员函数的话,this指针绑定在第一个参数上了, 写法不符合常规了(例如: 类对象 << cout).
重载运算符时,有哪些值得注意的事项?
- 算术运算符应该返回类型的值, 赋值运算符/复合赋值运算符应该返回左侧运算对象的引用,
- 如果一个类有算术运算符,则也应该定义它的复合赋值运算符, 并且算术运算符的功能由复合赋值运算符来完成.
- 下标运算符通常返回所访问对象元素的引用作为返回值,并且通常是返回普通引用,另一个是作为类的常量成员并返回常量引用, 这样一来就可以作用于常量对象了.
- 前置递增递减运算符返回对象的引用, 后置递增递减运算符多了一个int类型形参,并且返回类型为临时对象的值.
- 解引用运算符(
*
)与箭头运算符(->
)关系比较密切. 解引用运算符返回一个对象的引用. 箭头运算符返回对象的指针,而该对象是通过调用解引用运算符函数得到, 再加一个取地址符. - 关于箭头运算符,它比较特殊,: 它永远不能丢掉成员访问的基本含义, 当我们重载箭头时,可以改变的只有它从哪个对象当中获到成员.因此, 重载箭头运算符时的返回值必须是指向类对象的指针或一个重载了
->
的类对象. - 类型转换运算符没有显式的返回类型,也没有形参.
怎么能熟悉运算符重载?
平时基本很少写运算符重载的相关代码, 想要熟悉,只能多使用他们!!!