C++中的关键字operator能够对操作符进行重载,例如
//对操作符*重载
cuComplex operator*(const cuComplex &a)
{
}
//对操作符+重载
cuComplex operator+(const cuComplex &a)
{
}
代码实现
#include<iostream>
using namespace std;
struct cuComplex
{
float r;//复数实部
float i;//复数虚部
//无参构造函数初始化
cuComplex(){}
//带参构造函数初始化,注意没有“;”
cuComplex(float a, float b):r(a), i(b){}
cuComplex operator*(const cuComplex &complex)
{
cout<<"r = "<<r<<" "<<"complex.r = "<<complex.r<<endl;
cout<<"i = "<<i<<" "<<"complex.i = "<<complex.i<<endl;
//若z1=a+bi,z2=c+di,则z1*z2=(ac-bd)+(bc+ad)i
return cuComplex(r*complex.r-i*complex.i, i*complex.r+r*complex.i);
}
//求复数的模
float magnitude2(void){
return r*r+i*i;
}
};
int main(void)
{
cuComplex a(2.5,4.8);
cuComplex b(3.5,3.8);
cuComplex c;
c=a*b;
cout<<"模|c|="<<c.magnitude2();
return 0;
}
【注】这里特别注意一下带参构造函数初始化的C++语言风格。
运行结果
r = 2.5 complex.r = 3.5
i = 4.8 complex.i = 3.8
模|c|=781.75
【分析】
简单分析一下main()函数中c=a*b是如何实现的?
1)a,b,c的类型均是 cuComplex
2)为了便于理解,我们这里可以把operator*这个整体看做一个函数名。a*b其实就是cuComplex数据类型的a调用operator*这个“函数”,而根据这个“函数”的定义,显然我们需要传入一个参入“const cuComplex &a”,事实上,我们可以把cuComplex数据类型的b看做这个需要传入的参数。
3)简言之,对于a*b或a+b等等,操作符左边的变量作为“操作符重载函数”调用的主体,操作符右边的变量作为需要被传入的参量。例如本例中通过cuComplex数据类型的构造函数初始化a和b,a中的r和i分别被赋值为2.5和4.8,b中的r和i分别被赋值为3.5和3.8,cout的输出结果同样验证了我们的结论,即操作符左边是“函数”调用主体,操作符右边是需要传入的参数。
4一个结构体变量可以赋值给另一个相同类型的结构体,而a*b计算完成后返回的结果仍然cuComplex类型的,因此可以赋值给c。
cuComplex operator*(const cuComplex &a)
{
cout<<"r = "<<r<<" "<<"a.r = "<<a.r<<endl;
cout<<"i = "<<i<<" "<<"a.i = "<<a.i<<endl;
//若z1=a+bi,z2=c+di,则z1*z2=(ac-bd)+(bc+ad)i
return cuComplex(r*a.r-i*a.i, i*a.r+r*a.i);
}