Раздел «Образование».FIVTLecturesTerm2Lecture03:
<<Лекции ФИВТ, 2-й семестр

Лекция 3. Основы ООП. Класс комплексных чисел

Понятие класса и основы ООП в C++

Инкапсуляция данных. Методы экземпляров класса. Сокрытие внутренних данных и методов. Конструкторы и деструктор. Конструктор копирования. Переопределение оператора присваивания.

Реализация класса "Комплексное число"

Конструкторы на разные случаи жизни. Переопределение арифметических операторов. Новые ключевые слова: class, public, private, operator.

#include <iostream>
#include <cmath>

using namespace std;

class Complex         // класс "Комплексное число"
{
private:
  double re, im;      // действительная и мнимая части

public:
  // конструкторы 

  Complex ()
  {
  };

  Complex (double r)   
  {
    re = r;
    im = 0;
  }

  Complex (double r, double i)
  {
    re = r;
    im = i;
  }

  Complex (const Complex &c)   // конструктор копирования
  {
    re = c.re;
    im = c.im;
  }

  // деструктор
  ~Complex ()
  {
  }

  // остальные функции

  // Модуль комплексного числа
  double abs ()        
  {
    return sqrt (re * re + im * im);
  }

  // оператор присваивания
  Complex& operator = (Complex &c)   
  {
    re = c.re;
    im = c.im;

    return (*this);
  }


  // оператор +=
  Complex& operator += (Complex &c)   
  {
    re += c.re;
    im += c.im;
    return *this;
  }

  // оператор сложения
  Complex operator + (const Complex &c)   
  {
    return Complex (re + c.re, im + c.im);
  }

  // оператор вычитания
  Complex operator - (const Complex &c)   
  {
    return Complex(re - c.re, im - c.im);
  }

  // оператор умножения
  Complex operator * (const Complex &c)   
  {
    return Complex(re * c.re - im * c.im, re * c.im + im * c.re);
  }

  // оператор деления
  Complex operator / (const Complex &c)   
  {
    Complex temp;

    double r = c.re * c.re + c.im * c.im;
    temp.re = (re * c.re + im * c.im) / r;
    temp.im = (im * c.re - re * c.im) / r;

    return temp;
  }

  // укажем дружественные операторы, которым мы разрешаем доступ
  // к личным (private) данным
  friend ostream & operator<< (ostream &, const Complex &);   
  friend istream & operator>> (istream &, Complex &);         

};

// перегрузка оператора <<
ostream& operator<< (ostream &out, const Complex &c)
{
  out << "(" << c.re << ", " << c.im << ")";
  return out;
}

// перегрузка оператора >>
istream& operator>> (istream &in, Complex &c)
{
  in >> c.re >> c.im;
  return in;
}

int
main ()
{
  Complex a (5, 2);
  Complex b (3, -3);

  cout << "a = " << a << "; b =" << b << endl;

  a += b;
 
  cout << "a = " << a << "; b =" << b << endl;

  Complex c = a + b;

  cout << c << endl;
  cout << a + b << endl;
  cout << a * b << endl;

  return 0;
}

Осталось дописать этот код, чтобы решить задачу из задания:

1.3. «Комплексные числа». Напишите библиотеку для работы с комплексными числами. Определите класс Complex. Для хранения комплексного числа используйте представление a + I*b. Определите операторы +=, –=, *=, /=, +, –, *, / как с двумя комплексными, так и с одним комплексным и одним действительным числом. Определите также функции arg, abs, im, re.

Не забудьте рассмотреть случай, когда действительное число является левым операндом, а комплексное — правым.

Рекомендуется также:

  1. Не использовать в библиотеке "using namespace std;".
  2. Разделить код на три части: заголовок класса (heder with declaration), реализация класса (source with implementation), и код для тестирования работы библиотеки.
  3. приступить к изучению книг (хотя бы одной):
    • Мейерс С. Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов: Пер. с англ. - М.: ДМК Пресс, 2000. - 304 с.
    • Шилдт Г. Полный справочник по С++, 4-е изд. – М.: Издательский дом «Вильямс», 2006.
    • Страуструп Б. Дизайн и эволюция C++: Пер. с англ. - М.: ДМК Пресс, 2000. - 448 с.