一.运算符重载
对已有的运算符进行重新定义,赋予其另外的功能,以便其能适应不同的数据类型,使用operator关键字
- 运算符运算对象的个数,其个数决定了重载函数的参数
- 识别运算符左边的运算对象是类还是其他
类的对象:使用全局函数实现,不是很推荐;使用成员函数实现,推荐使用,可以少一个参数 - 其他:只能使用全局函数实现
//使用成员函数重载+
ob1 + ob2;
//上面可以看作是下面的形式
ob1.operator+(ob2);
1.重载<<
为了方便输出类的成员
using namespace std
class Person{
friend ostream& operator<<(ostream &out,Person &ob);
private:
int num;
string name;
float score;
public:
Person(){}
Person(int num,string name,float score):num(num),name(name),score(score){}
};
//左边不是自定义类,所以使用全局函数进行重定义
//为了其能访问到类中的私有成员,还要将其作为类的友元
ostream& operator<<(ostream &out,Person &ob){//注意这里参数的引用可能会出现问题
out<<ob.num<<" "<<ob.name<<" "<<ob.score;
return out;//返回cout
}
int main(){
Person lucy(100,"lucy",15.6f);
Person bob(100,"bob",15.6f);
//cout<<lucy;//cout无法正常的输出lucy中的所有信息
cout<<lucy<<bob<<endl;//使用返回发cout进行链式反应
return 0;
}
相对的重载>>运算符,就是为了方便给自定义类的对象赋值
istream& operator>>(istream &in,Person &ob){
in>>ob.num>>ob.name>>ob.score;
return in;
}
int main(){
Person lucy;
Person bob;
cin>>lucy>>bob;
return 0;
}
2.重载++
使用匿名参数进行区分前置++还是后置++
//后置++
Person operator++(int)
{
Person old = *this;//保存原先的数据,用于返回
num++;
name = name + name;
score++;
return old;
}
//前置++
Person operator++()
{
num++;
name = name + name;
score++;
return * this;
}
可以进行运行符重载
总结重载运算符是为了能完整的对自定义类进行一系列操作