6.10.1 operator函数的功能
我们要了解operator函数的功能,就举一个例子,让两个对象中的对应的数据相加生成一个新的对象。
我们一般会写出如下面的程序:
#include<iostream>
using namespace std;
class cAdd
{
private:
int va;
int vb;
public:
cAdd(){va=0;vb=0;}
cAdd(int a,int b){va=a;vb=b;}
void disp();
void set_va(int a){va=a;}
void set_vb(int b){vb=b;}
int get_va(){return va;}
int get_vb(){return vb;}
};
void cAdd::disp()
{
cout<<"va="<<va<<endl;
cout<<"vb="<<vb<<endl;
}
cAdd add(cAdd &data1,cAdd &data2)
{
cAdd sum;
sum.set_va(data1.get_va()+data2.get_va());
sum.set_vb(data1.get_vb()+data2.get_vb());
return sum;
}
int main()
{
cAdd a(100,200),b(10,20),c;
c=add(a,b);
c.disp();
}
这里强调一下add函数:
cAdd add(cAdd &data1,cAdd &data2)
{
cAdd sum;
sum.va=data1.va+data2.va;
sum.vb=data1.vb+data2.vb;
return sum;
}
这样写的话是错误的,因为cAdd add()是全局函数,并不能够直接调用类中的private数据,所以只能够通过调用set_va()和get_va()函数来实现。
那么,如果我想更加直观的表示两个对象的相加,也就是
c=a+b;
的话,我们就要引入operator函数了。
程序如下:
#include<iostream>
using namespace std;
class cadd
{
private:
int va;
int vb;
public:
cadd()
{
va=0;vb=0;
}
cadd(int a,int b)
{
va=a;vb=b;
}
void disp();
cadd operator+(cadd &dt);
cadd operator-(cadd &dt);
};
void cadd::disp()
{
cout<<"va="<<va<<endl;
cout<<"vb="<<vb<<endl;
}
cadd cadd::operator+(cadd &dt)
{
return cadd(va+dt.va,vb+dt.vb);
}
cadd cadd::operator-(cadd &dt)
{
return cadd(va-dt.va,vb-dt.vb);
}
int main()
{
cadd a(100,200),b(10,20),c;
c=a+b;
c.disp();
c=a-b;
c.disp();
}
这里可能会有一个小疑问
cadd cadd::operator+(cadd &dt)
{
return cadd(va+dt.va,vb+dt.vb);
}
为什么这里operator()里面只定义了一个参数?而实际确实两个对象对应的数据相加?因为另外一个参数是当前的对象。
也就是说,当两个数计算时,只需要设置一个参数;当一个数运算时,就不需要设置参数。
此处也可以用this指针
cadd cadd::operator+(cadd &dt)
{
return cadd(this->va+dt.va,this->vb+dt.vb);
}
另外还需要注意一点
c=a.operator+(b);
完全等价于
c=a+b;