Нужно понимать, что не существует операций между комплексными и действительными числами в математике. Действительные числа неявно приводятся к комплексным, и операции уже выполняются над комплексными числами.
C++ позволяет вам так делать, достаточно определить конструктор с 1 параметром.
Complex(double _r): Complex(_r, 0){}
Теперь любые числовые литералы и типы, которые могут быть неявно приведены к double, так же могут быть неявно приведены к Complex. Теперь можно писать следующее:
Complex(1,2) + 1;
Остаётся другая проблема. Операторы объявлены как функции-члены, что позволяет их использовать лишь тогда, когда левый операнд - комплексное число. Такое выражение не скомпилируется:
1 + Complex(1,2)
Что бы обойти эту проблему, нужно заменить функцию-член на дружественную функцию:
#include <iostream>
using namespace std;
class Complex {
public:
Complex(double _r, double _i): r(_r), i(_i){}
Complex(double _r): Complex(_r, 0){}
friend Complex operator + (const Complex &left, const Complex &right);
private:
double r,i;
};
Complex operator + (const Complex &left, const Complex &right) { //Friend function
return Complex(left.r + right.r, left.i + right.i);
}
int main() {
Complex a = 4;
Complex b(1,2);
int c = 5;
a+b; // OK
3+b; // OK
a+123.0f; // OK
c+a; // OK
return 0;
}