вопрос относительно “этого” указателя в C++

мне дали класс с международными 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)"; там?.

8
задан silent 28 March 2010 в 06:35
поделиться

5 ответов

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;
10
ответ дан 5 December 2019 в 07:11
поделиться

Во-первых, скажите разработчику кода не использовать 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 остаются постоянными).

4
ответ дан 5 December 2019 в 07:11
поделиться

Функция оператор + возвращает копию. Утверждение:

Bag result(*this);

Создает копию этого объекта, чтобы вернуть его вызывающему. Согласно подписи, он должен вернуть значение, поэтому он делает копию, а затем добавляет новый объект .

2
ответ дан 5 December 2019 в 07:11
поделиться

Bag result(*this); - это объявление переменной result и вызов ее конструктора копий.

Вы можете себе представить, что C++ автоматически объявляет конструктор копирования по умолчанию для всех классов. Его задача - просто инициализировать объект, используя другой объект:

Bag::Bag(Bag const& src) {
   x = src.x;
   y = src.y;
}

Выражение *this может выглядеть немного тревожно, но это обычный ужас C++, когда вы имеете дело с параметрами &.

2
ответ дан 5 December 2019 в 07:11
поделиться

Ваш код будет выглядеть так:

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;
}
5
ответ дан 5 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: