вопрос касательно указателя this в c ++ - PullRequest
8 голосов
/ 28 марта 2010

мне дали класс с переменными int и x в приватной форме и функцией перегрузки оператора,

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;
}

Каков эффект наличия "Bag bag (* this);" там?.

Ответы [ 5 ]

10 голосов
/ 28 марта 2010

Bag result(*this) создает копию объекта, для которого была вызвана функция оператора.

Пример, если было:

sum = op1 + op2; 

, тогда result будет копией 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;
5 голосов
/ 28 марта 2010

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

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;
}
4 голосов
/ 28 марта 2010

Во-первых, скажите разработчику кода, чтобы он не использовал new в качестве имени переменной - это ключевое слово. Также запомните return result;. И либо пройти по const-reference, либо напрямую изменить new bag.


Внутри структуры / класса this является указателем на себя. Следовательно, *this является ссылкой на весь экземпляр Bag.

Оператор Bag result(a_bag_reference) вызовет конструктор копирования Bag, который превращает копию a_bag_reference в result.

Таким образом,

Bag result(*this);

делает копию себя, затем сохраняет в result. Это делает следующие 2 утверждения

result.x += new.x;
result.y += new.y;

не влияют на сам экземпляр (т. Е. this->x и this->y сохраняются постоянными).

2 голосов
/ 28 марта 2010

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

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

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

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

2 голосов
/ 28 марта 2010

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

Bag result(*this);

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

...