Если вы планируете это сделать, вы можете сделать следующее. Во-первых, мы определяем следующее (вне класса, так что допускается неявное преобразование как для первого, так и для второго операнда), НЕ определяем никакой другой оператор +, такой как operator + (Complex, double):
Complex operator+(const Complex& a, const Complex& b) {
// ..
}
Одновременно определите неявный конструктор:
Complex(double a) : real(a), imag(0) {}
А затем определите оператор преобразования (как указывалось в разделе «Утилиты», это можно считать плохой практикой программирования, с этим я согласен; поэтому, если окончательное преобразование в double не требуется, пропустите это):
operator double() const { return real; }
Это автоматически будет поддерживать double c = a_complex + 10;
и double c = 10 + a_complex;
, число 10
будет неявно преобразовано в Complex
с помощью неявного конструктора, а арифметика будет преобразована в operator+(const Complex&, const Complex&);
, результат будет автоматически преобразован в удвоенное .
P.S. Вы также можете определить Complex& operator+=(const Complex& o) { /* .. */ }
внутри класса и использовать это для реализации operator+
выше.