两种方式的区别
区别:
- 使用成员函数来实现运算符重载时,少写一个参数,因为第一个参数就是this指针。
两种方式的选择:
- 一般情况下,单目运算符重载,使用成员函数进行重载更方便(不用写参数)
- 一般情况下,双目运算符重载,使用友元函数更直观
方便实现a+b和b+a相同的效果,成员函数方式无法实现。
例如: 100 + cow; 只能通过友元函数来实现
cow +100; 友元函数和成员函数都可以实现
特殊情况:
- = () [ ] -> 不能重载为类的友元函数!!!(否则可能和C++的其他规则矛盾),只能使用成员函数形式进行重载。
(2)如果运算符的第一个操作数要求使用隐式类型转换,则必须为友元函数(成员函数方式的第一个参数是this指针)
注意:
同一个运算符重载, 不能同时使用两种方式来重载,会导致编译器不知道选择哪一个(二义性)
运算符重载的禁区和规则
1. 为了防止对标准类型进行运算符重载,
C++规定重载运算符的操作对象至少有一个不是标准类型,而是用户自定义的类型
比如不能重载 1+2
但是可以重载 cow + 2 和 2 + cow // cow是自定义的对象
2.不能改变原运算符的语法规则, 比如不能把双目运算符重载为单目运算
- 不能改变原运算符的优先级
- 不能创建新的运算符,比如 operator**就是非法的, operator*是可以的
- 不能对以下这四种运算符,使用友元函数进行重载
= 赋值运算符,()函数调用运算符,[ ]下标运算符,->通过指针访问类成员
6. 不能对禁止重载的运算符进行重载
不能被重载的运算符
成员访问 | . |
域运算 | :: |
内存长度运算 | sizeof |
三目运算 | ? : : |
预处理 | # |
可以被重载的运算符
双目运算符 | + - * / % |
关系运算符 | == != < <= > >= |
逻辑运算符 | && || ! |
单目运算符 | +(正号) -(负号) *(指针) &(取地址) ++ -- |
位运算 | & | ~ ^ <<(左移) >>(右移) |
赋值运算符 | = += -= *= /= %= &= |= ^= <<= >>= |
内存分配 | new delete new[ ] delete[ ] |
其他 | ( ) 函数调用 -> 成员访问 , 逗号 |
Boy(int salary);
Boy(const char* name);
Boy& operator=(const Boy& boy);
bool operator>(const Boy& boy);
bool operator<(const Boy& boy);
bool operator==(const Boy& boy);
// 下标运算符的重载
int operator[](std::string index);
int operator[](int index);
// 该方式不适合
//ostream& operator<<(ostream& os) const;
friend ostream& operator<<(ostream& os, const Boy& boy);
friend istream& operator>>(istream& is, Boy& boy);
// 特殊的运算符重载:类型转换函数,不需要写返回类型
operator int() const;
operator char* () const;