пятница, 24 августа 2007 г.

Реализация класса комплексных чисел

Привет, кодер!
Отдых на лазурном берегу Черного моря продолжается. Тем не менее, мы продолжаем кодить =)
На днях была поставлена задача написать класс для работы с комплексными числами. Необходимо реализовать перегрузку операторов +, -, * и /. Также необходимо выделять память под вещественную и мнимую части комплексного числа. Высвобождение этой памяти. Также необходимо написать конструктор копирования.
Касс который мы будем писать, представляет собой по большому счёту тип. Т.е. объект класса это переменная типа Complex.
Итак, для начала посмотрим как выглядит интерфейс нашего класса:


class Complex
{
public:
    Complex(); // конструктор по умолчанию
    Complex(const Complex &c); //конструктор копирования
    Complex(float, float); // конструктор с параметрами (начальные значения)
    ~Complex();

    
    void Show();

    void SetValue();
    void Multiply(float);
    
    /* Перегрузка арифм. операторов */
    Complex& operator+=(const Complex&);

    Complex& operator-=(const Complex&);
    Complex& operator*=(const Complex&);
    Complex& operator/=(const Complex&);

    Complex operator+(const Complex&);
    Complex operator-(const Complex&);
    Complex operator*(const Complex&);
    Complex operator/(const Complex&);

    /* ### */
    Complex& operator=(Complex&); // перегрузка оператора присваивания
private:
    float *image, *real;
};


Как видно из приведённого кода, мы перегружаем операторы +=, -=, ..., +, -, ...а также оператор присваивания. Также у нас имеются несколько конструкторов - по умолчанию (в нём мы выделяем память), с двумя параметрами (для задания начальных значений), а также конструктор копирования. Функция Show() выводит на экран наше число в подобающей форме, при помощи SetValue() мы можешь задать значения мнимой и вещественной части, а функция Multiply(param) умножает наше комплексное число на param.
Далее приведу наиболее интересные отрезки кода, а именно реализацию некоторых методов.
Начнём с реализации функции для оператора +=:

Complex& Complex::operator+=(const Complex &cmpl2)
{
    *image = *image+*cmpl2.image;
    *real = *real + *cmpl2.real;
    return *this;
}


Тут, я думаю, всё понятно. Предположим в main() у нас имеется такой вот код:
int main()
{
    Complex c1, c2;
   c1 += c2;
}


В этом случае, при вызове функции для перегруженого оператора +=, *real и *image будут значениями c1, a *cmpl2.image и *cmpl2.real соответственно - с2.
Далее, целесообразно показать как реализована перегрузка оператора +:
Complex Complex::operator+(const Complex &cmpl2)
{
    Complex c(*this);
    c += cmpl2;
    return c;
}


Тут мы создаём объект нашего класса, с начальными значениями *this, для суммирования их со значениями cmpl2. Производится суммирование, и возвращается из функции копия объекта с, т.к. оригинал объекта по завершении функции будет утерян (почему? я думаю это требует объяснений ))

Похожим образом реализозованы и остальные функции перегруженых операторов.
Далее рассмотрим конструктор копирования. Для начала разберёмся что-же это такое. Конструктор копирования необходим, если переменная объектного типа передается в какую-нибудь функцию как аргумент, поскольку все аргументы передаются в функцию по значению. Есть конечно выход - передавать объект по ссылке (так, собственно, мы и делаем), тогда конструктор копирования нам не нужен. Однако для наглядности он был оставлен.
Вот его реализация:
Complex::Complex( const Complex &c )
{
    image = new float;

    real = new float;
    
    *image = *c.image;
    *real = *c.real;
}


Функция Show(). Как вы заметили, мнимую и вещественную части мы храним как два числа с плавающей точкой. Для представления копмлексного числа нам необходимо к мнимой части приставлять букву i. Итак, метод Show():

void Complex::Show()
{
    cout<<*image<<"i";
    *real<0 ? cout<<*real : cout<<"+"<<*real;
    cout<<endl;
    return;
}


Тут, опять-же, думаю нет ничего сверхестественного.
Вот вобщем-то и всё. Если есть какие-то вопросы - задаём, не стесняемся =)

Полный сорц можно посмотреть здеся.

Комментариев нет:

[Кодер]::Лого :) - просто как всё гениальное.