operator=()
неверен: пользователь Yakk - Adam
уже показал вам, как это исправить.Чтобы вы поняли, почему это неправильно и что делает return *this
;давайте посмотрим на вашу исходную функцию:
Complex operator=(Complex const &c) {
Complex Assignment;
Assignment.realPart = realPart;
Assignment.imaginaryPart = imaginaryPart;
return Assignment;
}
Здесь ваша подпись принимает константную ссылку на другой Complex
объект, эта часть верна.Ваш тип возвращаемого значения - Complex
объект, это по сути неправильно, потому что вы не хотите возвращать копию объекта.Целью здесь является выполнение задания.Это означает, что вы должны внести изменения в исходный экземпляр LHS
.
В выражении A = B + C
;A
считается LHS
экземпляром.Здесь вы хотите присвоить выражение (B + C)
, которые оба являются RHS
значениями.
Итак, когда Yakk - Adam
показал вам, как это исправить:
Complex& operator=(Complex const &c) {
realPart = c.realPart;
imaginaryPart = c.imaginaryPart;
return *this;
}
Одно из различий здесь заключается в том, что тип возвращаемого значения теперь Reference
к определенному объекту, а не к копии объекта.
Другое отличие состоит в том, что нет необходимости создавать локальную временную копию, как это было в исходной версии:
Complex Assignment; // this is not needed
Удалив его из operator=()
, он просто заменил следующие строки кода:
// Assignment.realPart = realPart; // To
realPart = c.realPart;
// Assignment.imaginaryPart = imaginaryPart; // To
imaginaryPart = c.imaginaryPart;
Здесь вы используете членов класса напрямую и присваиваете им значение, котороепринадлежит другому или c
, который передается оператору.
Затем, наконец, вернуть ваш экземпляр LHS
с обновленным значением;это где вы должны вернуть разыменованный указатель.
Что означает *this
?Указатель this является специальным указателем, который принадлежит всем типам class
и struct
.Например, в любой момент, когда у вас есть объект класса:
class Foo {
public:
int bar { 10 };
void addFive();
};
Вы можете использовать этот указатель непосредственно в ваших функциях-членах:
void Foo::addFive() {
this->bar += 5; // same as below (this) belongs to this particular instance.
// bar += 5;
}
Относительно вашего operator=()
;так как вы возвращаетесь на reference
, вы не можете просто return this
.Это вернет указатель this
.Мы не хотим указатель на объект, как мы хотим ссылку на объект;поэтому мы должны задержать указатель this
, вернув *this
.
Надеюсь, это поможет вам разобраться.