在数字图像处理领域,复数这一类型会被经常使用到。但是在C++和Qt中都没有可以使用的复数类。为了今后的方便,我们可以自己定义一个C++复数类,以便将来使用。
一、复数的属性
复数包含实数部分和虚数部分,如果直接使用 a + ib 的模式会使得后面的一系列操作变得较为复杂。这里我们直接给复数定义两个成员变量 m_rl 和 m_im。
1 public:
2 double m_rl,m_im;
二、我们同样需要构造函数来初始化复数实例
1 public:
2 ComplexNumber(double rl,double im);
3 ComplexNumber();
它们的实现如下:
1 ComplexNumber::ComplexNumber()
2 {
3 m_rl = 0;
4 m_im = 0;
5 }
6
7 ComplexNumber::ComplexNumber(double rl, double im)
8 {
9 m_rl = rl;
10 m_im = im;
11 }
三、现在我们给复数加上算术运算的功能
在复数的头文件中加入下述代码:
1 public:
2
3 // 重载四则运算符号
4
5 // 加
6 ComplexNumber operator +(const ComplexNumber &c){
7 return ComplexNumber(m_rl+c.m_rl,m_im+c.m_im);
8 }
9
10 // 减
11 ComplexNumber operator -(const ComplexNumber &c){
12 return ComplexNumber(m_rl-c.m_rl,m_im-c.m_im);
13 }
14
15 // 乘
16 ComplexNumber operator *(const ComplexNumber &c){
17 return ComplexNumber(m_rl*c.m_rl-m_im*c.m_im,
18 m_rl*c.m_im+m_im*c.m_rl);
19 }
20
21 // 除
22 ComplexNumber operator /(const ComplexNumber &c) {
23 if ((0==c.m_rl) && (0==c.m_im)) {
24 qDebug()<<"ERROR: divider is 0!";
25 return ComplexNumber(m_rl, m_im);
26 }
27
28 return ComplexNumber((m_rl*c.m_rl + m_im*c.m_im) / (c.m_rl*c.m_rl + c.m_im*c.m_im),
29
30 (m_im*c.m_rl - m_rl*c.m_im) / (c.m_rl*c.m_rl + c.m_im*c.m_im));
31
32 }
四、其他函数
1.设定复数值
1 void SetValue(double rl, double im); // 定义
2 void ComplexNumber::SetValue(double rl, double im) // 实现
3 {
4 m_rl = rl;
5 m_im = im;
6 }
2.取模
1 double get_mold(); // 定义
2 double ComplexNumber::get_mold() // 实现
3 {
4 double mold;
5 mold = sqrt(m_rl*m_rl+m_im*m_im);
6 return mold;
7 }
至此,复数的实现就完成了。