Простое задание
class Complex_num { private: double re; double im; public: Complex_num() { re = 0; im = 0; } Complex_num(double re = 0, double im = 0) { this->re = re; this->im = im; } Complex_num(const Complex_num& other) { this->re = other.re; this->im = other.im; } Complex_num(Complex_num&& other) noexcept { this->re = other.re; this->im = other.im; } // Нахождение модуля комплексного числа double mod(int a, int b) { return sqrt(a * a + b * b); } // Нахождение аргумента комплексного числа double arg(int a, int b) { return atan(double(im) / re); } // Перегрузка оператора сложения для комплексного Complex_num operator+(Complex_num other) { double re = this->re + other.re; double im = this->im + other.im; return Complex_num(re, im); } // Перегрузка оператора сложения для вещественного Complex_num operator+(double other) { double re = this->re + other; double im = this->im; return Complex_num(re, im); } // Перегрузка оператора разности для комплексного Complex_num operator-(Complex_num other) { double re = this->re - other.re; double im = this->im - other.im; return Complex_num(re, im); } // Перегрузка оператора разности для вещественного Complex_num operator-(double other) { double re = this->re - other; double im = this->im; return Complex_num(re, im); } // Перегрузка оператора умножения для комплексного Complex_num operator*(Complex_num other) { double re = this->re * other.re - this->im * other.im; double im = this->re * other.im + this->im * other.re; return Complex_num(re, im); } // Перегрузка оператора умножения для вещественного Complex_num operator*(double other) { double re = this->re * other; double im = this->im * other; return Complex_num(re, im); } // Перегрузка оператора деления для вещественного Complex_num operator/(double other) { double re = this->re / other; double im = this->im / other; return Complex_num(re, im); } // Оператор сравнения на равенство bool operator==(Complex_num other) { return this->re == other.re && this->im == other.im; } // Оператор сравнения на неравенство bool operator!=(Complex_num other) { return this->re != other.re || this->im != other.im; } // Оператор присвоения возвращает ссылку Complex_num& operator=(Complex_num other) { this->re = other.re; this->im = other.im; return *this; } // Оператор преобразования типа неявный operator double() const { return re; } // Оператор преобразования типа явный explicit operator int() const { return int(round(re)); } // Оператор () вытаскивает ссылку! на действительную часть double& operator()() { return re; } // Операторы действующий с потоками могут быть перегружены ТОЛЬКО через дружественные функции friend istream& operator>> (istream& in, Complex_num& matrix); friend ostream& operator<< (ostream& out, Complex_num& matrix); }; istream& operator>> (istream& in, Complex_num& num) { cout << "Введите целую часть:"; in >> num.re; cout << "Введите мнимую часть:"; in >> num.im; return in; } ostream& operator<< (ostream& out, Complex_num& num) { if (num.re != 0) out << num.re; if ((num.re == 0 && num.im > 0) || num.im < 0) out << num.im << "*i"; else out << "+" << num.im << "*i"; return out; }