C++主要操作符重载的定义和总结

一、输出操作符<<的重载

    ostream& operator << (ostream& os,const ClassType &object)

   {os<<//.....

    return os;}

   为了与IO标准库一致,操作符应接受ostream&作为第一个形参,对类类型const对象的引用作为第二个形参,并返回对ostream形参的引用。

二、输入操作符>>的重载

    istream& operator>>(istream& in,Sale_item& s)

  {in>>//....

   return in;}

  输入操作符的第一个形参是一个引用,它的第二个形参是对要读入的对象的非const引用,返回同一个流的引用。

三、加法操作符+的重载

  Sales_item operator+(const Sales_item& 1hs,const Sales_item& rhs)

      {  Sales_item ret(1hs);

         ret+=rhs;

         return ret;    }

为了与内置操作符保持一致,加法返回一个右值,而不是一个引用。

四、相等操作符==的重载

   bool operater == (const Sales_item &1hs,const Sales_item &rhs)

    {return 1hs.a==rhs.a&&1hs.b==rhs.b&&1hs.same_isbn(rhs);}

类使用相等操作符应表示每个对应数据成员都相等,使更容易与标准库一起使用,如算法find。同时应定义!=操作符。

五、关系操作符<的重载

  关联容器和某些算法使用小于操作符,所以定义operator<可能相当有用。

  但很多类不应该定义关系操作符,因为关系操作符与==的逻辑定义不一致,所以不定义会更好。

六、赋值操作符=的重载

  string& operator=(const string&);//  s1=s2;

  string& operator=(const char *);//   s1="str";

  string& operator=(char);//s1='c';

无论形参为何种类型,赋值操作符必须定义为成员函数,且必须返回对*this的引用。

七、下标操作符的重载

  const int& Foo::operator[] (const size_t index) const

   { return data[index] ;}

  int& Foo::operator[] (const size_t index) 

   { return data[index] ;}

下标操作符必须定义为类成员函数,且一般有非const成员并返回引用和const成员并返回const引用两个版本。

八、自增/自减操作符的重载

  1)前缀式:

     CheckedPtr&  CheckedPtr::operator++()

{    if(cur==end)   throw out_of_range("increment past the end of CheckedPtr);     //cur为私有数据成员        

     ++curr;      

    return *this;   }

   2)后缀式:

  CheckedPtr  CheckedPtr::operator++(int)

   {CheckPtr ret(*this);    //保存当前状态

    ++*this;

    return ret;  }

前缀式需要检查是否越界,后缀式函数需要接受一个额外的(即无用的)int型形参来区分前缀式函数。如果想要使用函数调用后缀式操作符,

必须给出一个整形实参值:  CheckedPtr parr(ia,ia_size)

                             parr.operator++(0);

最后补充几点:

1   除了函数调用操作符之外,重载操作符的形参数目(包括成员函数的隐式this指针)与操作符的操作数数目相同。

2   重载操作符必须具有至少一个类类型的操作数。

3   作为成员函数的操作符有一个隐含的this形参,限定为第一个操作数

4   类一般都需重载输入/输出操作数,IO操作符必须为非成员符,所以类常将其设为友元。

5   &&&||和,等操作符最好不要重载。 

   

 

猜你喜欢

转载自blog.csdn.net/lzkit/article/details/7749761