Шаг 413.
Библиотека STL. Числовые типы. Операции над комплексными числами. Создание, копирование и присваивание комплексных чисел

    На этом шаге мы рассмотрим методы, создающие комплексное число.

    В таблице 1 перечислены конструкторы и операции присваивания для типа complex. Конструкторам могут передаваться исходные значения вещественной и мнимой частей. Если значения не заданы, они инициализируются конструктором по умолчанию для соответствующего типа.

Таблица 1. Конструкторы и операции присваивания класса complex<>
Выражение Эффект
complex с Создает комплексное число с нулевой вещественной и мнимой частями (0+0i)
complex c(1.3) Создает комплексное число с вещественной частью 1.3 и нулевой мнимой частью (1.3+0i)
complex c(1.3, 2.4) Создает комплексное число с вещественной частью 1.3 и мнимой частью 2.4 (1.3+2.4i)
complex c1(c2) Создает комплексное число c1 как копию с2
polar(4.2) Создает временное комплексное число по полярным координатам (амплитуда = 4.2, фазовый угол = 0)
polar(4.2, 0.75) Создает временное комплексное число по полярным координатам (амплитуда = 4.2, фазовый угол = 0.75)
conj(c) Создает временное комплексное число, сопряженное с числом с (то есть комплексное число с противоположным знаком мнимой части)
c1 = с2 Присваивает c1 вещественную и мнимую части с2
c1 += С2 Прибавляет с2 к c1
c1 -= c2 Вычитает с2 из c1
c1 *= с2 Умножает c1 на с2
c1 /= с2 Делит c1 на с2

    Значение существующего комплексного числа может быть изменено только при помощи операторов присваивания. Комбинированные операторы присваивания +=, -=, *= и /= осуществляют суммирование, вычитание, умножение и деление значений двух комплексных операндов.

    Вспомогательная функция polar() позволяет создать комплексное число, инициализируемое в полярных координатах (через амплитуду и фазовый угол, указанный в радианах):

  // Создание комплексного числа с инициализацией в полярных координатах 
  std::complex<double> c2(std::polar(4.2.0.75));

    Если в создании комплексного числа задействовано неявное преобразование типа, возникает проблема. Например, следующее решение работает нормально:

  std::complex<float> c2(std::polar(4.2,0.75)); // OК

    Однако похожая запись со знаком равенства ошибочна:

  std::complex<float> c2 = std::polar(4.2.0.75); // ОШИБКА

    Эта проблема рассматривается далее.

    Вспомогательная функция conj() позволяет создать комплексное число, инициализированное значением, сопряженным с другим комплексным числом (то есть комплексным числом с противоположным знаком мнимой части):

  std::complex<double> с1(1.1,5.5);
  std::complex<double> c2(conj(c1)); // c2 инициализируется как
                                     // complex<double>(l.1,-5.5)

    На следующем шаге мы рассмотрим неявные преобразования типов.




Предыдущий шаг Содержание Следующий шаг