Перегрузка оператора присваивания в C ++ Синтаксис Объяснение - PullRequest
0 голосов
/ 28 мая 2018

Я новичок в C ++.Мне нужна помощь в понимании этого фрагмента кода.

Queue & operator=(const Queue &rhs)
{
    front = rhs.front;
    nWaiting = rhs.nWaiting;
    for (int i = front, j = 0; j < nWaiting; j++) 
    {
        elements[i] = rhs.elements[i];
        i = (i + 1) % 100;
    }
    return *this;
}

Я не могу понять, почему в коде есть оператор «&» и как это работает вместе с * this.

Я понимаю перегрузку оператора.Например,код ниже для операции перегрузки сложения.Однако я не понимаю, почему '&' требуется для перегрузки оператора присваивания (=).

V3 operator* (const double factor, const V3 &b)
{
    return (b * factor);
}

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Оператор может быть в порядке без какого-либо возвращаемого значения, однако обычно включение цепочек происходит, как в

c = (a = b);

. Это присвоит b a, а затем назначит возвращаемое значение operator= звоните c.Поскольку вы не хотите делать ненужную копию, вы возвращаете ссылку на сам объект, также известный как *this.На самом деле избегание копирования - не единственная причина использования ссылки, но если вы рассмотрите

(d = e) = f;

, тогда это будет работать только так, как ожидалось (сначала присваивая e d, а затем присваивая fв d), если operator= возвращает неконстантную (!) ссылку.

Обратите внимание, что operator* отличается, поскольку предполагается, что он не изменяет объект, для которого вызывается, а скорее возвращаетновый экземпляр (следовательно, нет & в возвращении operator*).

0 голосов
/ 29 мая 2018

& означает, что оператор возвращает ссылку (исходный объект) вместо значения (копии объекта).Это позволяет избежать ненужного копирования.this - указатель на сам объект, к которому вызывается оператор, поэтому return *this означает возвращение ссылки на объект с левой стороны =.

. Это позволяет операторубыть прикованным, как a = b = 1.Сначала присваивается значение от 1 до b, и возвращается ссылка на b.Значение b затем присваивается a.Так что a и b оба равны 1.

0 голосов
/ 28 мая 2018

Ссылка означает, что избегать копирования объекта.В результате он вернет ссылку на тот же объект .Кроме того, в результате будет получено lvalue .И если вы подумаете об этом, это то, что вы хотите сделать, когда используется оператор присваивания.

Каждый объект в C ++ имеет доступ к своему собственному адресу через указатель this.

Это означает, чточто вы возвращаете сам объект.

Если ваш вопрос состоит в том, почему мы используем *this вместо this, то это происходит потому, что вам нужно разыменовать указатель первым, так каквозвращаемый тип - это ссылка (а не указатель, например).

...