мне дали класс с международными X и Y переменных конфиденциально и функцию перегрузки оператора,
class Bag{
private:
int x;
int y;
public:
Bag();
~Bag();
//.......
//.....etc
};
Bag operator+ (Bag new) const{
Bag result(*this); //what does this mean?
result.x += new.x;
result.y += new.y;
}
Что является эффектом наличия "Результата сумки (*this)"; там?.
Bag result (* this)
создает копию объекта, для которого была вызвана операторная функция.
Пример, если было:
sum = op1 + op2;
, то результат
будет копией op1
.
Поскольку функция operator +
вычисляет сумму своих операндов и возвращает сумму, нам нужен способ доступа к операнду op1, который осуществляется через указатель this
.
В качестве альтернативы мы могли бы сделать:
Bag result;
result.x = (*this).x + newobj.x; // note you are using new which is a keyword.
result.y = (*this).y + newobj.y; // can also do this->y instead
return result;
Во-первых, скажите разработчику кода не использовать new
в качестве имени переменной - это ключевое слово. Также не забудьте вернуть результат;
. И либо перейдите по константной ссылке, либо напрямую измените пакет новый
.
Внутри структуры / класса this
является указателем на самого себя. Следовательно, * this
является ссылкой на сам экземпляр Bag.
Оператор Bag result (a_bag_reference)
вызывает конструктор копирования Bag
, который делает копию a_bag_reference
в результат
.
Следовательно,
Bag result(*this);
создает копию самого себя, а затем сохраняет в результат
. Это заставляет следующие 2 оператора
result.x += new.x;
result.y += new.y;
не влиять на сам экземпляр (т.е. this-> x
и this-> y
остаются постоянными).
Функция оператор +
возвращает копию. Утверждение:
Bag result(*this);
Создает копию этого объекта, чтобы вернуть его вызывающему.
Согласно подписи, он должен вернуть значение, поэтому он делает копию, а затем добавляет новый объект
.
Bag result(*this);
- это объявление переменной result
и вызов ее конструктора копий.
Вы можете себе представить, что C++ автоматически объявляет конструктор копирования по умолчанию для всех классов. Его задача - просто инициализировать объект, используя другой объект:
Bag::Bag(Bag const& src) {
x = src.x;
y = src.y;
}
Выражение *this
может выглядеть немного тревожно, но это обычный ужас C++, когда вы имеете дело с параметрами &
.
Ваш код будет выглядеть так:
class Bag {
public:
Bag();
Bag(Bag const& other); // copy ctor, declared implicitly if you don't declare it
~Bag();
Bag operator+(Bag const& other) const;
private:
int x;
int y;
};
Bag Bag::operator+(Bag const& other) const {
Bag result (*this);
result.x += other.x;
result.y += other.y;
return result;
}
Неявный «текущий объект» для функций-членов указывается специальным значением с именем this . Затем * this
получает этот объект (путем разыменования this ), и он используется для создания (через конструктор копирования) другого Bag с именем result .
Я подозреваю, что этот код взят из домашнего задания, поэтому вы, возможно, не сможете использовать шаблон один истинный оператор сложения , но это распространено, и вы должны знать о нем:
struct Bag {
//...
Bag& operator+=(Bag const& other) {
x += other.x;
y += other.y;
return *this; // return a reference to the "current object"
// as almost all operator=, operator+=, etc. should do
}
};
Bag operator+(Bag a, Bag const& b) {
// notice a is passed by value, so it's a copy
a += b;
return a;
}