【发布时间】:2009-03-13 11:12:35
【问题描述】:
赋值运算符可以声明为
T& 运算符= (const t&);
在一个类中,但算术运算符不能这样定义。它必须是朋友功能。我不明白为什么?能解释一下吗?
【问题讨论】:
赋值运算符可以声明为
T& 运算符= (const t&);
在一个类中,但算术运算符不能这样定义。它必须是朋友功能。我不明白为什么?能解释一下吗?
【问题讨论】:
算术运算符不应该是友元
你可以这样定义:
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;
}
当 + 运算符的左侧不是一个类,或者它是一个类但你不能将运算符 + 添加到它的定义时,必须这样做。
【讨论】:
我认为C++ FAQ Lite会给你一个明确的答案。
【讨论】:
理想情况下,它们应该是全局变量,不一定是朋友,这样您就可以编写:
yourtype v = 1;
yourtype w = 1 + v;
因为 1 不是 yourtype 的对象,所以如果 operator+ 是成员,它将抛出一个合适的结果。但是,将其设为全局会使其将 1 转换为 yourtype,然后执行操作。使其成为朋友有助于根据需要提取和操纵yourtype 的成员——尽管不是必需的。例如:你可以实现成员函数operator+=,并在operator+的实现中使用它。
【讨论】:
问题是,如果你这样做:
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 库使这个过程变得非常简单。
【讨论】: