赋值运算符可以声明为
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;
}
当 + 运算符的左侧不是一个类,或者它是一个类但您不能将运算符 + 添加到其定义中时,必须这样做。
理想情况下,它们应该是全局变量而不一定是朋友,这样您就可以编写:
yourtype v = 1;
yourtype w = 1 + v;
因为, 1 不是 的对象yourtype
,如果operator+
是成员,它会抛出一个合适的。但是,使其成为全局使其将 1 转换为yourtype
然后执行操作。使其成为朋友有助于根据需要提取和操纵成员yourtype
- 尽管不是必需的。例如:您可以实现成员函数operator+=
并在operator+
.
我认为C++ FAQ Lite会给你一个明确的答案。
问题是,如果您执行以下操作:
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 库使这个过程非常容易。