c ++中的赋值运算符

roo*_*kie 1 c++

让我们假设我有一些A类并从中派生出来B:我想operator=为B 编写(让我们假设我有operator=我的A类)正确的方法来做到这一点:

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

如果我写的话有什么不同

((A) *this) = rhs;
Run Code Online (Sandbox Code Playgroud)

提前致谢

Ben*_*igt 5

你的第二个代码只会将A部分(切片)复制*this到一个临时变量中,分配它,并将其丢弃.不是很有帮助.

我会把那行写成:

A::operator=(rhs);
Run Code Online (Sandbox Code Playgroud)

这很清楚它是在调用基类版本.

在模板情况下,转换和分配可能会更好,在这种情况下,您实际上不知道您的基类是什么,以及它是否有operator=成员或朋友或什么.

在这种情况下:

A* basethis = this;
*basethis = rhs;
Run Code Online (Sandbox Code Playgroud)

更容易阅读和理解.

  • @ ianmac45:Ben Voigt是对的.OP的第二个代码确实创建了一个`*this`的副本,因为`((A)*this)= rhs`相当于`static_cast <A>(*this)= rhs`,在这种情况下相当于` A(*this).operator =(rhs)`(C++标准5.2.9/2).创建一个临时的"A",然后调用赋值运算符,将`rhs`作为参数传递,然后对该临时值进行破坏. (2认同)
  • @rookie:`((A)*this)= rhs`相当于C++标准5.4/5的`static_cast <A>(*this)= rhs`.然后,通过C++标准5.2.9/2,该表达式相当于`A(*this).operator =(rhs)`.表达式'A(*this)`创建一个临时的类型`A`将`*this`传递给`A`的复制构造函数.在调用`A`的赋值运算符之后出现的表达式`.operator =(rhs)`.当赋值运算符返回时,临时被破坏. (2认同)
  • @rookie:另一方面,表达式`((A&)*this)= rhs`完全相同,但它不是创建一个临时的"A",而是创建一个临时的"A&",它是一个引用,这是另一个对象的别名.所以在一个类型为`A&`的变量上调用`operator =()`在原始对象上调用`operator =()`(在本例中为`*this`),好像它是类型`A`,但不复制也不破坏原始物体. (2认同)