Я думаю, что правильное решение:
class CComplex {
public:
CComplex();
CComplex(int); // NEW - CONVERSION CONSTRUCTOR
CComplex(double real);
CComplex(double real, double imaginary);
friend CComplex operator + (const CComplex& a, const CComplex& b); // FRIEND - NON-MEMBER FUNCTION
};
Обратите внимание на следующие функции в коде:
- Существует конструктор, получающий один
int
параметр. Это конструктор приведения, который компилятор может использовать для автоматического преобразования из int
в CComplex
.
operator+
- функция, не являющаяся членом (ключевое слово friend
делает функцию неучастной). Это немного отличается от ситуации, когда operator+
является функцией-членом (CComplex operator+(CComplex const &b) const
).
Если вы напишите:
CComplex c1;
5 + c1;
Затем для 5 + c1
ищется operator+
с параметрами (int,CComplex)
. В соответствии со стандартом C ++ допускается только одно преобразование для получения правильных типов параметров (извините, у меня нет формальных кавычек). Существует конструктор преобразования из int
в CComplex
, поэтому автоматически вызывается этот конструктор преобразования, а затем operator+(CComplex,CComplex)
с соответствующими параметрами.
Если у вас не было CComplex(int)
конструктора, то 5 + c1
не будет работать, потому что требуется ДВУХ преобразование из: int
в double
и из double
в CComplex
.
Кроме того, если бы operator+
была функцией-членом (не friend
), она бы вообще не работала. Потому что в соответствии со стандартом C ++ нет возможности автоматического преобразования для левого операнда. Так что даже конструктор преобразования CComplex(int)
не поможет.
Плюс: я думаю, что перегрузка operator+
для таких типов, как (int, CComplex)
не очень хорошая идея, потому что это может привести к взрыву объявлений. То же самое, что вам нужно для operator-()
и для любого порядка операндов - например, (CComplex,int)
, (CComplex,long)
и т. Д. Предоставляя конструктор преобразования из необходимых типов, вы получаете все эти комбинации «автоматически» и «бесплатно».