重载加号运算符的正确方法是什么?

What is the right way to overload the plus operator?

我有一套类:

class A 
{
public:
    A(B b) {//..}   
    A(C C) {//..}
    A(D D) {//..}

    A& operator+=(A const& ls) {//..}
    A operator+(A const& ls) const {//..}
}

class B
{
//....
}

class C
{
//....
}

class D
{
//....
}

我要支持以下操作:

1) A result = a1 + a2;
2) a1 += a2;
3) A result = b1 + a1; (and C, D classes instead of B)
4) A result = a1 + b1; (and C, D classes instead of B)
5) a1 += b1; (and C, D classes instead of B)

遇到这种情况怎么办?我不想使用 boost.

您缺少的是 BCDA 的隐式转换,用于 operator+ 的 LHS。您可以通过使运算符成为非成员函数来允许这样做。例如:

A operator+(A const& ls, A const& rs)
{
  A ret = ls;
  ret += rs;
  return ret;
}