Класс комплексных чисел с операциями над ними определен в среде разработки Borland C++ в файле complex.h. Мы воспользуемся этим файлом с упрощениями, не искажающими смысла, и снабдим необходимыми, на наш взгляд, комментариями – это хороший образец для последующего самостоятельного определения класса векторов, являющегося по существу обобщением класса комплексных чисел на многомерное пространство.
Итак, файл complex.h –включаемый библиотечный файл определения комплексных чисел. Для экономии места мы опускаем директивы препроцессора условной компиляции и другие несущественные детали.
class complex
{
/*Нам понадобятся рабочие переменные для хранения Re и Im*/
double re, im;
/*А дальше определим общедоступные функции-члены класса и начнем с конструкторов*/
public:
/*конструктор с инициализацией вещественной и мнимой частей при объявлении комплексного числа в прикладной программе*/
complex(double __re_val, double __im_val=0)
{ re=__re_val; im=__im_val;}
//конструктор по умолчанию
complex() {re=im=0;}
/*текущие значения вещественной и мнимой частей возвратят функции*/
double real(){ return re;}
double imag(){ return im;}
//сопряженное данному комплексное число
complex conj(){ return complex(re,-im);}
//Модуль и аргумент комплексного числа
double norm () { return(re*re+im*im) ;}
double arg(){return (!re&&!im)?0:atan2(im,re);}
/*Операции над комплексными объектами.
Бинарные операции могут быть определены в двух вариантах, различающиеся местом размещения результата - либо с изменением текущего значения объекта, либо без, с помещением результата во внешней по отношению к объекту переменной комплексного типа. Мы определим простые бинарные операции как внешние дружественные классу функции не члены класса. Поэтому сначала объявим их прототипы, а определения приведем вне тела класса.
*/
/*Операции проверки равенства и неравенства комплексных чисел*/
friend int operator==(complex _FAR &, complex _FAR &);
friend int operator!=(complex _FAR &, complex _FAR &);
/*Бинарные алгебраические операции над парами комплексных чисел, комплексным и вещественным, вещественным и комплексным */
Унарные +, - и * комбинированные с присвоением арифметические операции сделаем функциями-членами, изменяющими текущее значение комплексного объекта. Мы объединим их объявления с определениями. */
complex operator+(){ return *this;}
complex operator-(){ return complex(-re,-im);}
complex _FAR & operator+=(complex _FAR &)
{
re+=__z2.re;
im+=__z2.im;
return *this;
}
complex _FAR & operator+=(double __re_val2)
{
re+=__re_val2;
return *this;
}
complex _FAR & operator-=(complex _FAR & __z2)
{
re-=__z2.re;
im-=__z2.im;
return *this;
}
complex _FAR & operator-=(double __re_val2)
{
re-=__re_val2;
return *this;
}
complex _FAR & operator*=(complex _FAR & __z2)
{
re=re*z2.real()-im*z2.imag();
im=re*z2.imag()+z2.real()*im;
return *this;
}
complex _FAR & operator*=(double __re_val2)
{
re*=__re_val2;
im*=__re_val2;
return *this;
}
complex _FAR & operator/=(complex _FAR & __z2)
{
re=(re*z2.real()+im*z2.image())/
(z2.real()*z2.real()+z2.imag()*z2.imag());
im=(z2.real()*im-re*z2.imag())/
(z2.real()*z2.real()+z2.imag()*z2.imag());
return *this;
}
complex _FAR & operator/=(double __re_val2)
{
re/=__re_val2;
im/=__re_val2;
return *this;
}
/*В заключение определим и функцию потокового вывода комплексного объекта*/
/* Теперь приведем реализацию дружественных операторных функций, не являющихся членами класса и реализующих бинарные операции над комплексными объектами. */