@WildOne2802

Какая разница между return this и return *this?

Вопрос в том, что возвращает
iterator &operator+=(Value_Type idx) {
                ptr_ += idx;
                return *this;
            }
<\code>
в представленном ниже РАБОЧЕМ коде.
<code lang="cpp">


class iterator : public std::iterator<std::random_access_iterator_tag, Value_Type> {
        private:
            Value_Type *ptr_;

        public:
            using difference_type = typename std::iterator<std::random_access_iterator_tag, Value_Type>::difference_type;
            iterator() : ptr_(nullptr) {}
            explicit iterator(Value_Type *ptr) : ptr_(ptr) {}
            iterator(const iterator &it) : ptr_(it.ptr_) {}
            ~iterator() = default;

            iterator &operator+=(Value_Type idx) {
                ptr_ += idx;
                return *this;
            }
            iterator &operator-=(Value_Type idx) {
                ptr_ -= idx;
                return *this;
            }
            iterator operator++() {
                ptr_++;
                return *this;
            }
            iterator &operator--() {
                ptr_--;
                return *this;
            }
            iterator operator++(Value_Type) {
                iterator tmp(*this);
                ++ptr_;
                return tmp;
            }
            iterator operator--(Value_Type) {
                iterator tmp(*this);
                --ptr_;
                return tmp;
            }

            difference_type operator - (const iterator& itr) const { return ptr_ - itr.ptr_; }
            iterator operator + (Value_Type idx) {return iterator(ptr_ + idx);}
            iterator operator - (Value_Type idx) {return iterator(ptr_ - idx);}

            Value_Type &operator*() const { return *ptr_; }
            Value_Type *operator->() const { return ptr_; }
            Value_Type &operator[](const Value_Type idx) { return ptr_[idx]; }

            bool operator == (const iterator & other) const {return other.ptr_ == this->ptr_;}
            bool operator != (const iterator & other) const {return other.ptr_ != this->ptr_;}
            bool operator < (const iterator & other) const {return other.ptr_ < this->ptr_;}
            bool operator > (const iterator & other) const {return other.ptr_ > this->ptr_;}
            bool operator >= (const iterator & other) const {return other.ptr_ >= this->ptr_;}
            bool operator <= (const iterator & other) const {return other.ptr_ <= this->ptr_;}
        };
</code>
  • Вопрос задан
  • 1355 просмотров
Решения вопроса 1
this — это указатель на текущий объект. *this — это ссылка на текущий объект. Пример:

class A {
public:
  int x;
  A(const A& other) = default;
  A& operator=(const A& other) {
    x = other.x;
    return *this;
  }
};

void test() {
  A a(1);  // a.x == 1
  A b(2);  // b.x == 2
  A c(3);  // c.x == 3

  a = b = c;
  // a.x == 3
  // b.x == 3
  // c.x == 3
}


Как работает вот это присваивание? Оператор присваивания право-ассоциативен, то есть компилятор видит это как a = (b = c);. Итак, вначале b = c. Вызывается b.operator=(c). Там мы вначале присваиваем c.x (3) в b.x, затем (и это здесь самое главное!) возвращаем ссылку на b. Далее в a = (результат) объекту a присваивается та самая возвращённая ссылка на b, благодаря чего в a.x тоже оказывается 3.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Возвращает объект,на который ссылается указатель.
Ответ написан
@none7
Изначально операция *указатель пришла из Си и там она называлась "разыменования указателя". Означает, что все операции будут произведены со значением на которое ссылается указатель. При присвоении значения другой переменной будет создана копия значения. Но в C++ всё осложнило введение ссылочного типа, символ '&'. Это тот же указатель, но каждая операция с ним аналогична *(указатель) и соответственно арифметика указателей со ссылками невозможна(без приведения типов).
В данном примере происходит разыменование указателя на объект, но так как возвращаемый тип ссылка, то происходит автоматическое приведение типа в неё. Логично предположить, что в результате операции += произойдёт копирование из ссылки, но ничерта, она просто выбрасывается...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы