2010-10-02 7 views
1

давайте предположим, что у меня есть некоторый класс А и производные от него B: Я хочу написать operator= для B (давайте предположим, что у меня есть operator= в моем класс) правильный способ сделать это:оператор присваивания в C++

B& B::operator=(const B& rhs) 
{ 
if(this == &rhs) return *this; 
((A&) *this) = rhs; //<-question 
//some other options 
return *this 
} 

какая разница, если я пишу

((A) *this) = rhs; 

заранее спасибо

+0

Используйте if (this! = & Rhs) вместо if (this == & rhs). – DumbCoder

+1

@DumbCoder: предполагается, что он поймает 'x == x;' и в настоящее время делает это правильно. Я не согласен с предложенными вами изменениями. –

+1

@Ben Voight, я думаю, DumbCoder предполагает, что OP должен изменить его 'if', чтобы проверить несамоуправление и выполнить операцию копирования, а затем обрабатывать самоопределение в части' else'. Поскольку самоназначение не является (или, по крайней мере, не должно быть) нормальным вариантом использования, это означает, что 'if' почти всегда преуспевает, тем самым предотвращая инструкцию ветвления и связанные с ней потоки трубопроводов. – Praetorian

ответ

5

Ваш второй код будет скопируйте только часть A (нарезка) *this во временную переменную, назначьте ее и выбросите. Не очень полезно.

Я бы вместо того, чтобы написать эту строку как:

A::operator=(rhs); 

, что делает его очень ясно, что это применение версии базового класса.

Каста и назначение может быть лучше в ситуации с шаблоном, когда вы фактически не знаете, что такое ваш базовый класс, и имеет ли он своего члена или друга operator= или что-то еще.

В этом случае:

A* basethis = this; 
*basethis = rhs; 

легче читать и понимать.

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