1

赋值运算符可以声明为

T& 运算符= (const t&);

在一个类中,但不能以这种方式定义算术运算符。它必须是朋友功能。我不明白为什么?你能解释一下吗?

4

4 回答 4

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;
}

当 + 运算符的左侧不是一个类,或者它是一个类但您不能将运算符 + 添加到其定义中时,必须这样做。

于 2009-03-13T12:17:42.500 回答
2

理想情况下,它们应该是全局变量而不一定是朋友,这样您就可以编写:

yourtype v = 1;
yourtype w = 1 + v;

因为, 1 不是 的对象yourtype,如果operator+是成员,它会抛出一个合适的。但是,使其成为全局使其将 1 转换为yourtype然后执行操作。使其成为朋友有助于根据需要提取和操纵成员yourtype- 尽管不是必需的。例如:您可以实现成员函数operator+=并在operator+.

于 2009-03-13T11:19:47.693 回答
2

我认为C++ FAQ Lite会给你一个明确的答案。

于 2009-03-13T11:27:07.487 回答
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 库使这个过程非常容易。

于 2009-03-13T16:16:58.897 回答