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>
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.