#include<iostream>
#include<cstdlib>
#include<stdlib.h>
#include<string>
using namespace std;
class Couple{
private:
int a,b;
public:
Couple(int a=0,int b=0):a(a),b(b){cout<<"Call constructor"<<endl;}
Couple operator+(const Couple& c);
Couple operator*(const int& k);
Couple operator*(const Couple& c);
friend bool operator==(const Couple& c1,const Couple& c2){return (c1.a==c2.a)&&(c1.b==c2.b);}
friend Couple operator*(const int& k,const Couple& c);//由于成员函数的操作符重载要求左操作数必须是Couple本类的
//一个对象,所以不支持整数左乘对象的形式,因此对于这种情形,可以将这种乘法定义为友元函数去重载
Couple operator-(const Couple& c);//参数可以不是Couple类型的引用,但是如果不采用引用传递,就会变成值传递
//值传递就会产生对象的拷贝动作,降低效率,也可以不采用常引用,但是如果这个引用它引用的变量不是常量,那么
//如果还不采用常引用的话,就可以在函数内部修改所引用的变量的值,这是不太允许的。
Couple operator/(const int k);
void Show(){
cout<<a<<" "<<b<<endl;
}
};
//由于是friend,所以不需要指明类
Couple operator*(const int &k,const Couple& c){
Couple new_res(k*c.a,k*c.b);
return new_res;
}
Couple Couple::operator*(const int& k){
Couple new_res(k*this->a,k*this->b);
return new_res;
}
Couple Couple::operator/(const int k)
{
if(k==0){
cout<<"Error can not divided by zero!"<<endl;
return *this;//return *this is correct
}
Couple new_res(a/k,b/k);
return new_res;
}
Couple Couple::operator+(const Couple& c){
Couple new_res(this->a+c.a,this->b+c.b);
return new_res;
}
Couple Couple::operator*(const Couple& c){
Couple new_res(this->a*c.a,this->b*c.b);
return new_res;
}
Couple Couple::operator-(const Couple& c){
Couple new_res(this->a-c.a,this->b-c.b);
return new_res;
}
int main()
{
Couple a(3,4),b(1,2);
Couple c=a+b;
c.Show();//4,6
Couple d=c/2;
d.Show();//2,3
Couple e=3*d;//如果不重载为类的友元函数,左操作数只能是Couple类的对象,那么这个计算无法进行,编译器会调用3.operator*(d),显然错误
e.Show();//6,9
Couple f=e*2;
f.Show();//12,18
//每次都会调用一次构造函数
bool bo=(f==e);//False is 0
bool bo2=(f==Couple(12,18));//True is 1
cout<<bo<<" "<<bo2<<endl;
return 0;
}
来源:CSDN
作者:m0_45478865
链接:https://blog.csdn.net/m0_45478865/article/details/104405764