赋值运算符可以声明为
T&安培; operator =(const t&);
在一个类中,但算术运算符不能这样定义。它必须是朋友的功能。我不明白为什么?你能解释一下吗?
答案 0 :(得分:4)
算术运算符不应该是朋友
你可以这样定义:
MyClass MyClass::operator + (const MyClass& t) const
{
MyClass ret(*this);
ret += t;
return ret;
}
a + b
实际上是一种语法糖,编译器会将其扩展为a.operator+(b)
。如果您的所有对象都是MyClass实例,那么上一个示例将起作用,但如果您必须与其他类型一起操作(即1 + a
,则不起作用将无法工作,这可以通过使用朋友来解决。
MyClass operator + (int i, const MyClass& t)
{
MyClass ret(i);
ret += t;
return ret;
}
当+运算符的左侧不是类时,或者它是一个类但你不能将operator +添加到它的定义时,必须这样做。
答案 1 :(得分:2)
理想情况下,他们应该是全局的,而不一定是朋友,所以你可以写:
yourtype v = 1;
yourtype w = 1 + v;
因为,1不是yourtype
的对象,如果operator+
是成员,它会抛出一个拟合。但是,将其设置为全局会使其将1转换为yourtype
,然后执行操作。使其成为朋友有助于根据需要提取和操纵yourtype
的成员 - 尽管不是必需的。作为示例:您可以实现成员函数operator+=
并在operator+
的实现中使用它。
答案 2 :(得分:2)
我认为C++ FAQ Lite会给你一个明确的答案。
答案 3 :(得分:0)
问题在于,如果你这样做:
class A
{
A& operator+(int n);
// ...
}
int main()
{
A my_var;
int integer = 1;
A + integer; // compiles
integer + A // error: no function operator+(int, A) defined
}
它不会编译。 一个解决方案是将operator +(int,A)和operator +(A,int)定义为A的朋友。 另外,Boost Operators库使这个过程变得非常简单。