运算符重载
运算符重载是一种形式的C++多态。c++能够使用户定义多个名称相同但特征标(参数列表)不同的函数。这种被称为函数重载或者函数多态,旨在能用同名的函数来完成相同的操作。运算符重载也是如此。例如*号操作既可用于做指针地址,又可用于做两个数之间的乘法操作。C++会根据操作数的数目和类型来决定采用哪种操作。
重载运算符方式:operatorop(argument-list)
eg:operator+() 重载+号运算符,operator *()重载*号运算符。op必须为有效的运算符。
以下为重载+,*运算符实例:
#include<iostream>
using namespace std;
class User
{
private:
int num;
public:
User(int newNum);
User operator+(User& u) const;
User operator*(User& u) const;
int getNum() const;
void setNum(int newNum);
};
User::User(int newNum) {
this->num = newNum;
}
User User::operator+(User& u) const {
User user = User(0);
int Num = u.num + this->num;
user.setNum(Num);
return user;
}
User User::operator*(User& u) const {
User user = User(0);
int Num = u.num * this->num;
user.setNum(Num);
return user;
}
void User::setNum(int newNum) {
this->num = newNum;
}
int User::getNum() const {
return this->num;
}
int main() {
User u1 = User(1);
User u2 = User(2);
User u3 = u1 + u2;
User u4 = u1 + u2 + u3;
User u5 = u4 * u3;
cout << u3.getNum() << endl; //output 3
cout << u4.getNum() << endl; //output 6
cout << u5.getNum() << endl; //output 18
return 0;
}
重载限制
- 重载后的运算符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载运算符。
- 使用运算符时不能违反运算符原来的句法规则。例如不能讲求模运算符(%)重载成使用一个操作数,同样不能修改运算符的优先级。例如两个类相加的运算,加号和标准的加号运算优先级相同。
- 不能创造新的运算符,例如不能定义operator**()函数来表示求幂。
- 不能重载以下运算符:
- sizeof(sizeof运算符)
- .(成员运算符)
- .*(成员指针运算符)
- ::(作用域解析运算符)
- ?:(条件运算符
- typeid(一个RTTI运算符)
- const_cast(强制类型转换运算符)
- dynamic_cast(强制类型转换运算符)
- reinterpret_cast(强制类型转换运算符)
- static_cast(强制类型转换运算符)
5. 下面运算符只能通过成员函数进行重载:
- =(赋值运算符)
- ()(函数调用运算符)
- [](下标运算符)
- ->:通过指针访问类成员的运算符
总结:可重载的运算符如下表:
+ | - | * | / | % | ^ |
& | | | ~= | ! | = | < |
> | += | -= | *= | /= | %= |
^= | &= | |= | << | >> | >>= |
<<= | == | != | <= | >= | && |
|| | ++ | -- | , | ->* | -> |
() | [] | new | delete | new[] | delete[] |