C++ 复数相关函数(二)
另外一个我们需要的操作则是乘法。不像加法那样,乘法在极坐标系中容易,在笛卡尔坐标系中麻烦些(是相对有点麻烦而已)。
在极坐标系,我们只需将模相乘,角度相加。像往常那样,我们使用访问函数来实现而不必关心对象的表现形式。
Complex mult (Complex& a, Complex& b)
{
double mag = a.getMag() * b.getMag()
double theta = a.getTheta() + b.getTheta();
Complex product;
product.setPolar (mag, theta);
return product;
}
这儿我们遇到一个小问题,即我们没有一个构造函数来接收极坐标系的值。添加这样的一个构造函数也可以,但是要记得只有在参数不同时才能重载一个函数(包括构造函数)。在这个例子中,我们要添加的构造函数仍然是接收两个浮点型的参数,所以没法重载。
另外一个办法是提供一个访问函数来设置变量的值,为使操作正常进行,我们需要确保当mag与theta的值被设定时,极坐标的标志位也要设置为真,同时还要确保笛卡尔坐标系的标志位设置为假。这是因为,如果我们手动设置了极坐标的值,笛卡尔坐标系的值就会失效。
void Complex::setPolar (double m, double t)
{
mag = m; theta = t;
cartesian = false; polar = true;
}
作为练习,请写出对应的函数setCartesian。
为测试mult函数,我们可以这样做:
Complex c1 (2.0, 3.0);
Complex c2 (3.0, 4.0);
Complex product = mult (c1, c2);
product.printCartesian(); 该程序的输出结果为:
-6 + 17i
在这个输出的背后进行了很多转换。当我们调用mult时,两个参数为被转换为极坐标系的表示形式。结果也是极坐标形式,当我们调用printCartesian时,就会再转换回笛卡尔坐标系的形式。没错,我们就这样得到了正确结果,很奇妙吧。