复制赋值运算符中引用/常量引用返回的必要性
C 中的复制赋值运算符引发了有关其返回类型的问题。为什么它返回一个引用或一个常量引用而不是新对象的副本?为了阐明这个概念,请考虑以下场景:
A a1(param); A a2 = a1; A a3; a3 = a2; // The problematic line
假设复制赋值运算符定义如下:
A A::operator=(const A& a) { if (this == &a) { return *this; } param = a.param; return *this; }
从复制赋值运算符返回引用具有显着的优点关于归还副本。通过返回引用,它可以完成最少的工作,因为它仅将值从一个对象复制到另一个对象。
但是,按值返回会产生额外的开销。每次调用赋值运算符时,都会调用构造函数和析构函数,导致不必要的资源消耗。例如:
A& operator=(const A& rhs) { /* ... */ }; a = b = c; // Calls assignment operator twice. Efficient.
相反:
A operator=(const A& rhs) { /* ... */ }; a = b = c; // Calls assignment operator twice, calls copy constructor twice, calls destructor twice for temporary values. Inefficient.
因此,从复制赋值运算符返回引用或 const 引用可以通过避免不必要的对象创建和销毁来优化性能,从而提高效率和代码可维护性。
以上是为什么 C 复制赋值运算符返回引用而不是副本?的详细内容。更多信息请关注PHP中文网其他相关文章!