重载操作符的定义:

  一、  不可重载的操作符:::  .*   .  ?.;必须重载为成员函数的操作符:(),[],->,->;

  二、  重载操作符必须具有一个类类型的操作数;

        1、内置类型的操作符,含义不能改变;

        2、不能为任何内置类型定义新的操作符;

  三、  优先级和结合性是固定的;

  四、  作为类成员的重载函数,其形参看起来比操作数少一,因为含有一个this指针;

  

 

重载输出《《:

  一般定义:

   

1 ostream& operaotr<<(ostream& os,const classtype& object)
2         {
3             os<<。。。。。
4         return os;
5         }

输出操作符所做的格式化应尽量少;

IO操作符必须为非成员函数,一般为友元函数;

重载输入》》:

eg:

1 //Sale calss
2 istream& operator>>(istream& in,Sale& s){
3     double price;
4     in>>s.isbn>>s.units_sold>>price;
5        if(in)
6             s.revenue=s.units_sold*price;
7         else
8             s=Sale();  //input fail:reset object to default state;
9 }

设计输入操作符时,如果可能,要确定错误恢复措施;以确保对象处于一致和可用状态;

定义算术操作符:既定义了算数操作符又定义了复合操作符的类,一般应使用复合操作符,这样避免创建和撤销一个临时变量。

定义相等操作符:

    bool operator==(const type&a,const type&2);//declare;

    1、操作符的两个对象必须是相同类型;

    2、定义了==,也应定义!=;

重载下标操作符:

重载下标操作符 [] 是很常见的事情,它保存类中元素的顺序。vector 和 string 就是这样的类。在重载操作符[]时,一定要记住定义它的两个版本:非常量版本和常量版本:

class MyString
{
private:
  char * buff;
  int size;
public:
   //...
  char& operator [] (int index) { return buff[index]; } // 非常量版本
  const char& operator [] (int index) const { return buff[index]; } // 常量版本  第一个const 返回值,第二个是函数不改变数据成员
};

当对象本身是常量时,下标操作符的常量版本被调用。

void f(const MyString& str)
{
  char c = str[0]; // 调用const char& operator [] (int index) const

}

感觉应该有范围检查;

 posted on 2013-04-28 21:07  wxhzt  阅读(173)  评论(0编辑  收藏  举报