C++ Primer笔记(14) 重载操作符与转换

来源:互联网 发布:乐视网络电视盒 编辑:程序博客网 时间:2024/05/19 03:29

重载操作符的定义

重载操作符是具有特殊名称的函数:保留字operator后接需定义的操作符符号。重载操作符具有返回类型和形参表。

eg:Sales_item operator+(const Sales_item&,const Sales_item&);

 

重载操作符必须具有一个类类型操作数

用于内置类型的操作符其含义不能改变。例如,内置的整型加号操作符不能重定义:

//error:cannot redefine built-in operator for ints

int operator+(int,int);

也不能为内置数据类型重定义加号操作符。如,不能定义接受两个数组类型操作数的operator+。

 

重载操作符必须具有至少一个类类型或枚举类型的操作数。这条规则强制重载操作符不能重新定义用于内置类型对有的操作符的含义。

 

优先级和结合性是固定的。

除了函数调用操作符operator()之外,重载操作符时使用默认实参是非法的。

 

类成员与非成员

作为类成员的重载函数,其形参看起来比操作数数目少1。作为成员函数的操作符有一个隐含的this形参,限定为第一个操作数。

 

操作符重载和友元关系

操作符定义为非成员函数时,通常必须将它们设置为所操作类的友元。 

 

重载操作符的设计:

不要重载具有内置含义的操作符

大多数操作符对类对象没有意义

 

输入和输出操作符

输出操作符<<的重载

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

eg:ostream& operator <<(ostream& os,const ClassType &object

     {

         os << //....

         return os;

      }

 

输入操作符>>的重载

输入操作符的第一个形参是一个引用,指向它要读的流,并且返回的也是对同一个流的引用。第二个形参是要读入的对象的非const引用,该形参必须为非const,因为输入操作符的目的是将数据读到这个对象中。

输入和输出操作符有如下区别:输入操作符必须处理错误和文件结束的可能性。

eg:

istream&

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

{

  double price;

  in >> s.isbn >> s.units_sold >> price;

  if(in)

    s.revenu = s.units_sold * price;

  else

    s = Sales_item(); // input failed:redst object to default state

  return in;

}

 

设计输入操作符时,如果可能,要确定错误恢复措施,这很重要。

 

算术操作符和关系操作符

一般而言,将算术和关系操作符定义为非成员函数,像下面给出的Sales_item加法操作符一样:

Sales_item

operator+(const Sales_item& lhs, const Sales_item&  rhs)

{

  Sales_item ret(lhs);  //copy lhs into a local object that we'll return

  ret += rhs;  //add in the contents of rhs

   return ret; //return ret by value

}

 

相等操作符

inline bool

operator==(const Sales_item &lhs,const Salesitem &rhs)

{

  return lhs.units_sold == rhs.units_sold &&

             lhs.revenue == rhs.revenue &&

             lhs.same_isbn(rhs);

}

inline bool

operator!=(const Sales_item &lhs,const Sales_item &rhs)

{

  return !(ls == rhs);  //!= define in terms of operator==

}

 

关系操作符

定义了相等操作符的类一般也具有关系操作符。龙其是,因为关联容器和某些算法使用小于操作符,所以定义operator<可能相当有用。

 

赋值操作符

赋值操作符可以重载,无论形参为何种类型,赋值操作符必须定义为成员函数,这一点与复合赋值操作符有所不同。

赋值必须返回对*this的引用

eg:

Sales_item& Sales_item::operator++(const Sales_item& rhs)

{

  units_sold += rhs.units_sold;

  revenue += rhs.revenue;

  return * this;

}

 

下标操作符

下标操作符必须定义为类成员函数。

 

成员访问操作符

为了支持指针型类,例如迭代器,C++语言允许重载解引用操作符(*)和箭头操作符(->)。

箭头操作符必须定义为类成员函数。解引用操作符不要求定义为成员,但将它作为成员一般也是正确的。