复制赋值运算符中通过引用返回:一个复杂的概念揭晓
C 中从复制赋值运算符返回引用的概念可以令人困惑。为什么不简单地返回新对象的副本?为了解开这个谜团,让我们深入研究一个涉及 A 类及其赋值运算符的示例:
class A { public: A(int param); A& operator=(const A& a); private: int param; }; int main() { A a1(10); A a2 = a1; A a3; a3 = a2; // The problematic line } A::A(int param) : param(param) {} A& A::operator=(const A& a) { if (this == &a) { return *this; } param = a.param; return *this; }
最初,从赋值运算符返回一个值似乎是一个可行的选择。然而,在这种情况下按值返回会带来一些缺点。每次调用赋值运算符时,都会调用构造函数和析构函数。考虑以下赋值链:
a = b = c;
返回值时,此链会触发对赋值运算符的两次调用、对复制构造函数的两次调用以及对析构函数的两次调用。这种浪费的过程消耗了不必要的资源,并且没有提供任何切实的好处。
相比之下,通过引用返回可以显着减少开销。值从一个对象复制到另一个对象,无需额外的构造函数或析构函数调用。这种优化在发生多次赋值的复杂场景中尤其重要。
总而言之,在复制赋值运算符中按值返回没有任何优势,但会带来严重的性能损失。相比之下,通过引用返回可确保高效的资源利用,同时保持运算符的功能。
以上是为什么从 C 复制赋值运算符返回引用而不是值?的详细内容。更多信息请关注PHP中文网其他相关文章!