Cpp_操作符重载

来源:互联网 发布:人工智能发展史 知乎 编辑:程序博客网 时间:2024/06/05 00:00

一、双目操作符的重载

1.计算类双目操作符
形如L#R的表达式会被编译器处理为形如L.operator#(R)的成员函数的调用,该函数的返回值即为表达式的值。
形如L#R的表达式也可以被编译器处理为形如::operator#(L,R)的全局函数的调用,该函数的返回值即为表达式的值。
2.赋值类双目操作符
表达式的值是一个左值,而且它就是左操作数本身。
左操作数不能是常量,右操作数可以是常量。

二、单目操作符的重载

1.计算类单目操作符
形如#O的表达式会被编译器处理为形如O.operator#()的成员函数的调用,该函数的返回值即为表达式的值。
形如#O的表达式也可以被编译器处理为形如::operator(O)的全局函数的调用,该函数的返回值即为表达式的值。
2.自增减单目操作符
1)前缀自增减:#O -> O.operator#() / ::operator# (O)
操作数不能是右值,返回值是操作数的引用。
2)后缀自增减:O# -> O.operator#(0) / ::operator# (O, 0)
操作数不能是右值,返回值是操作数自增减之前的副本。

三、其它操作符的重载

1.插入/提取操作符:<

四、操作符重载的限制

1.不是所有的操作符都能重载,下列操作符不能重载:

1)作用域限定操作符(::)2)直接成员访问操作符(.)3)直接成员指针解引用操作符(.*)4)条件操作符(?:)5)字节长度操作符(sizeof)6)类型信息操作符(typeid)

2.如果一个操作符所有的操作数都是基本类型,则该操作符无法被重载。

int operator+ (int a, int b) { return a - b; }int x = 1 + 1;cout << x << endl; // 0

3.操作符重载不会改变编译器预定义的优先级。

class Integer { ... };Integer const operator^ (Integer const& x, int y) {    Integer z (1);    for (int i = 0; i < y; ++i)        z.m_i *= x.m_i;    return z;}d = a + b ^ c; // d = (a + b) ^ c;

4.操作符重载无法改变操作数的个数。
double operator% (Integer const& opd) {
return opd.m_i / 100.0;
}
double x = 50%; // x : 0.5

5.无法通过操作符重载发明新的操作符。
Double const operator@ (Double const& a, Double const& b) {
return Double (sqrt (a.m_d * a.m_d + b.m_d * b.m_d));
}
Double c = 3.0 @ 4.0; // c : 5.0

0 0
原创粉丝点击