重载算术运算符

时间:2009-03-13 11:12:35

标签: c++ operator-overloading

赋值运算符可以声明为

T&安培; operator =(const t&);

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

4 个答案:

答案 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库使这个过程变得非常简单。