运算符在C ++中重载为int + obj

时间:2009-07-27 14:41:43

标签: c++ operators operator-overloading operator-keyword

我有以下课程: -

class myclass
{
    size_t st;

    myclass(size_t pst)
    {
        st=pst;
    }

    operator int()
    {
        return (int)st;
    }

    int operator+(int intojb)
    {
        return int(st) + intobj; 
    }

};

只要我这样使用它就可以正常工作: -

char* src="This is test string";
int i= myclass(strlen(src)) + 100;

但我无法做到这一点: -

int i= 100+ myclass(strlen(src));

任何想法,我怎么能实现这个?

4 个答案:

答案 0 :(得分:22)

在类之外实现运算符重载:

class Num
{
public:
    Num(int i)
    {
        this->i = i;
    }

    int i;
};

int operator+(int i, const Num& n)
{
    return i + n.i;
}

答案 1 :(得分:12)

您必须将运算符实现为非成员函数,以允许左侧的原始int。

int operator+( int lhs, const myclass& rhs ) {
    return lhs + (int)rhs;
}

答案 2 :(得分:4)

此处的其他答案将解决问题,但以下是我在执行此操作时使用的模式:

class Num
{
public:
  Num(int i)       // Not explicit, allows implicit conversion to Num
  : i_ (i)
  {
  }

  Num (Num const & rhs)
  : i_ (rhs.i_)
  {
  }

  Num & operator+= (Num const & rhs)  // Implement +=
  {
    i_ += rhs.i_;
    return *this;
  }

private:
    int i_;
};

//
// Because of Num(int), any number on the LHS or RHS will implicitly
// convert to Num - so no need to have lots of overloads
Num operator+(Num const & lhs, Num const & rhs)
{
  //
  // Implement '+' using '+='
  Num tmp (lhs);
  tmp+=rhs;
  return tmp;
}

这种方法的一个主要好处是,您的功能可以相互实现,从而减少您需要的整体代码量。

<强>更新

为了避免性能问题,我可能会将非成员运算符+定义为内联函数,如:

inline Num operator+(Num lhs, Num const & rhs)
{
  lhs+=rhs;
  return lhs;
}

成员操作也是内联的(因为它们在类体中声明),所以所有代码都应该非常接近添加两个原始int对象的成本。

最后,正如jalf所指出的,需要考虑允许隐式转换的后果。上面的例子假设从积分类型转换为'Num'是明智的。

答案 3 :(得分:2)

您需要一个全局函数运算符+(int,myclass)来执行此操作:

int operator+( int intobj, myclass myobj )
{ return intobj + int(myobj); }