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

时间:2015-06-23 12:26:28

标签: c++ operator-overloading pass-by-reference pass-by-value

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

如果 operator = 的参数类型定义为引用,则无法运行以下行,因为右侧是值且没有任何地址:

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

但是我希望能够做这样的分配,并希望通过引用将参数传递给 operator = (因为我的类的对象很大)。是否有可能或我必须通过值??

将参数传递给 operator =

3 个答案:

答案 0 :(得分:2)

你只需要通过reference-to-const接受参数:

const

sum = A + B引用可以绑定到rvalues,因此{{1}}有效。

答案 1 :(得分:2)

课程' operator=()通常会接受const引用。因此X::operator()会接受const X &。这确实允许链接。非const引用不允许传递A + B之类的表达式的结果(因为逻辑上需要临时的)。

其他类型的参数的

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

答案 2 :(得分:0)

运算符重载是能够使用引用作为参数的普通函数。请记住使用const引用而不是干净的引用来处理rvalues,因为它们可以将它们的生命延长到函数的范围。

顺便说一句,你没必要将 operator + 声明为朋友功能 - 你也可以让它成为你班级的一员。

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)
{
    ...
}