Я написал класс для комплексных чисел, в котором я перегрузил оператор +, и все работает нормально, однако мне нужно реализовать это как функцию, не являющуюся членом, и я не уверен, как и почему это дает преимущество.
Вот мой код .h:
class Complex
{
private:
double a;
double b;
public:
Complex();
Complex(double aGiven);
Complex(double aGiven, double bGiven);
double aGetValue();
double bGetValue();
double operator[](bool getB);
Complex add(Complex &secondRational);
Complex operator+(Complex &secondRational);
}
.каст:
Complex Complex::add(Complex &secondRational)
{
double c = secondRational.aGetValue();
double d = secondRational.bGetValue();
double anew = a+c;
double bnew = b+d;
return Complex(anew,bnew);
}
Complex Complex::operator+(Complex &secondRational)
{
return add(secondRational);
}
Будем весьма благодарны за любую помощь в том, как сделать их функциями, не являющимися членами!
Вот оператор сложения вне класса:
Complex operator+(const Complex& lhs, const Complex& rhs) {
//implement the math to add the two
return Complex(lhs.aGetValue() + rhs.aGetValue(),
lhs.bGetValue() + rhs.bGetValue());
}
Конечно, вам нужно будет объявить aGetValue()
а также bGetValue()
как const
:
double aGetValue() const {return a;}
double bGetValue() const {return b;}
Вы можете объявить друга своим Complex
учебный класс
class Complex {
// blah....
friend Complex operator+(Complex const& a, Complex const & b);
};
Перегруженный оператор может получить доступ к приватным членам Комплекса.
Обычный подход к арифметическим операциям состоит в том, чтобы определить рефлексивные версии операторов как члены и чистые версии как не-члены, реализуя их с рефлексивными версиями:
class complex {
public:
const complex& operator+=(const complex& rhs) {
real += rhs.real;
imag += rhs.imag;
return *this;
}
};
complex operator+(const complex& lhs, const complex& rhs) {
complex res(lhs);
res += rhs;
return res;
}
Как объяснено выше pippin1289.
Почему объясняется ниже:
Представьте, что нужно использовать объект класса как
Complex c3 = 5 + c1;// for c3 object c1's real part (a) added with 5
В C ++ сохраняют порядок операндов. Компилятор разрешает вызов выше сложения как
5.оператор + (постоянный комплекс & другое); // что невозможно
Следовательно, перегрузите его через свободную функцию.
Ваш класс предоставляет необходимую информацию через открытый интерфейс, такой как aGetValue () и bGetValue.
Следовательно, эта бесплатная перегруженная + операторная функция не обязательно должна быть другом класса.
Кроме того, предпочитайте функции, не являющиеся друзьями, а не функции-членам, поскольку это помогает снизить степень инкапсуляции.
Это объясняется здесь ==> http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197?pgno=1