2017-02-16 1 views
0

Я знаю, что оператор «+» должен что-то вернуть, и это имеет смысл для меня.Почему оператор присваивания возвращает что-нибудь для начала?

Но я не понимаю, почему мы возвращаем объект при перегрузке оператора «=». Например, посмотрите на следующее:

const Scene& Scene::operator=(const Scene &source){ 
    if(this != &source){ 
     count = source.count 
    } 
    return *this; 
} 

Не можем ли мы добиться такого же эффекта, просто используя это?

void Scene::operator=(const Scene &source){ 
    if(this != &source){ 
     count = source.count 
    } 
} 
+0

Для таких вещей, как 'a = b = c;', не ошибочный 'if (a = b) {...' и оценивая значение, затем используя его в выражении в той же строке: 'a = b + (c = d); ' –

ответ

4

Семантика оператора =, что вы можете цепи задания:

a = b = c; 

Вы должны вернуть объект для того, чтобы иметь смысл.

+0

* цепь какая? – LogicStuff

+2

@LogicStuff - я не уверен, что я следую. Что ты спрашиваешь? –

+1

То, что вы * можете * хотеть связать также такие вещи, как '(a = b) == c' - не все назначения. – LogicStuff

0

Вы можете возвращать ссылку, и что поддерживает назначение цепочки, как в

a = b = 42; 

& hellip; которая, так как это = правоассоциативной, анализируется как

a = (b = 42); 

& hellip; так что оба a и b установлены на 42.

Однако вы не должны, если ваш оператор присваивания ничего не возвращает, если вы не хотите поддерживать использование ваших объектов в стандартной библиотечной коллекции.

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

Также вам необходимо использовать эту форму декларации, чтобы delete или default оператор присваивания для вашего класса.

Смежные вопросы