Перекрытие операторов в операторе c ++ = - PullRequest
1 голос
/ 02 октября 2019

Ниже приведен класс Node с оператором = перегружен (только показывает бит самоназначения).

Node& operator=(const Node &other) {
        if ( this != &other) {
             // do stuff
        }
    }

Мой вопрос заключается в том, почему мне нужно явно вводить «& other», а не «other»уже ссылка на объект Node? Также, когда я разыскиваю "this" и сравниваю как:

if ( *this!= other ) 

, это все равно выдаст ошибку. Это потому что this является константным указателем на объект Node, а 'other' является константным объектом Node? Потому что даже что-то подобное не сработает:

Node& operator=(const Node &other) {
    if ( (const Node)*this != other) {
            // do stuff
    }
}

Ответы [ 2 ]

1 голос
/ 02 октября 2019

не является ли "other" ссылкой на объект Node?

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

Поэтому из-за их различий вы обычно не можете сравнивать указатели и ссылки. Поэтому, чтобы проверить идентичность объекта, вам нужно получить адрес из ссылок, а затем сравнить его с указателем this.

Это потому, что это константный указатель на объект Node, но 'other - это объект const Node?

Нет, это потому, что *this получает псевдоним объекта, а other уже есть. Когда вы пишете *this != other, вы пытаетесь применить != к самим объектам , а не к их адресам. Поскольку, вероятно, operator!= не определено, вы не можете сделать сравнение. Я также не подозреваю, что вы хотите.

Потому что даже что-то подобное не сработает

(const Node)*this разыменовывает this, таким образом получая что-то, что не указатель (но объект), а затем пытается привести объект к типу указателя. Это не то, что язык поддерживает неявно. Отсюда и ошибка.

0 голосов
/ 02 октября 2019

Прежде всего, проверка того, совпадает ли другой узел с узлом this, требуется только в том случае, если деталь do stuff требует большой работы и / или вероятности использования operator= на том же узле. (т. е. node = node) довольно высоко.

Таким образом, чтобы проверить, совпадает ли другой узел с узлом this, вы хотите сравнить, если два узла имеют одинаковый адрес в памяти. Сравнение ссылок на узлы, если оно было реализовано, будет сравниваться, только если два узла имеют одинаковые значения.

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

...