赋值运算符的参数类型(引用或值?)

argument type of assignment operator (reference or value?)

我有一个 class 并想为此 class 重载“+”和“=”运算符。所以我将 operator+ 实现为友元函数,将 operator= 实现为成员函数...

如果operator=的参数类型定义为reference,那么下一行不能是运行,因为右边是一个值,不要'没有地址 :

sum = A + B;   // sum, A and B are objects of my class

但我希望能够进行此类赋值,并且还希望通过引用将参数传递给 operator=(因为我的 class 的对象很大)。有可能还是我必须按值将参数传递给 operator=

你只需要通过常量引用来获取参数:

MyClass& operator= (const MyClass&);

const 引用可以绑定到右值,因此 sum = A + B 有效。

A class' operator=() 通常接受 const 引用。所以 X::operator() 将接受 const X &。这确实允许链接。非 const 引用将不允许传递像 A + B 这样的表达式的结果(因为这在逻辑上需要一个临时的)。

operator=() 对于其他类型的参数(例如 lhs X 和 rhs Y)可以按值传递(如果 Y 具有工作副本构造函数)即 X &X::operator=(Y),但是通过 const 引用在实践中更常见,因为它减少了创建临时对象的机会。

运算符重载是能够使用引用作为参数的普通函数。请记住通过使用 const 引用而不是干净的引用来处理右值,因为它们会延长它们在函数范围内的寿命。

顺便说一句,您不必将 operator+ 声明为友元函数 - 您也可以将其设为 class.[=11= 的成员]

struct A
{
    int x;
    A(int x): x(x) {}
    A operator+(const A&);
    A& operator=(const A&);
};

A A::operator+(const A& right_side_of_equation)
{
    ...
}

A& A::operator=(const A& object_to_be_assigned)
{
    ...
}