赋值运算符的参数类型(引用或值?)
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)
{
...
}
我有一个 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)
{
...
}