C++ 重载操作符基础

来源:互联网 发布:linux压缩文件夹命令 编辑:程序博客网 时间:2024/04/28 09:20

概念:
 通过操作符重载,可以针对类类型的操作数定义不同的操作符版本。如果只依靠使用IO使用命名函数以下的情况将无法避免。
 cout.print("The sum of ").print(v1).print(" and ").
  print(v2).print(" is ").print(v1+v2).
  printO("/n").flush();
而通过操作符重载可以使编写和阅读程序容易得多。
 cout<<"The sm of "<< v1 << " and "<< v2 <<" is " << v1+v2 <<endl;


定义:
 重载操作符是具有特殊名称的函数:保留字operator 后接需定义的操作符符号。像任意其他函数一样,具有返回类型和形参表。例如
 Sales_item operator+(const Sales_item&, const Sales_item&);
声明了加号操作符,可以用与将两个Sales_item对象“相加”并获得一个Sales_item对象的副本。


类型:
输入和输出操作符
算数操作符和关系操作符
赋值操作符
下标操作符
成员访问操作符
自增和自减操作符


调用操作符
定义一个名为absInt的结构体,该结构体封装将int类型的值转换为绝对值的操作:
 struct absInt{
  int operator() (int val){
   return val < 0 ? -val : val;
  }
 };
这个类定义了一个操作:即函数调用操作符operator()。该操作符有一个形参并返回形参的绝对值。
通过为该类类型的对象提供一个实参而使用调用操作符,所用的方式看起来像一个函数调用:
 int i = -42;
 absInt absObj;
 unsigned int ui = absObj(i);
尽管absObj是一个对象而不是函数,我们仍然可以“调用”该对象,效果是运行由absObj对象定义的重载调用操作符。定义了调用操作符的类,其对象常称为函数对象,即它们是行为类似函数的对象。


转换操作符
是一种特殊的类成员函数。它定义将类类型值转变为其他类型值得转换。转换操作符在类定义体内声明,在保留字operator之后跟着转换的目标类型:
 class SmallInt{
 public:
  SmallInt(int i = 0): val(i)
  {
   if(i < 0 || i > 255)
   throw std::out_of_range("Bad SmallInt initializer");
  }
  operator int() const { return val; }
 private:
  std::size_t val;
 };
转换函数采用通用形式operator type()。type表示内置类型名、类类型名或类型别名所定义的名字。对任何可作为函数返回类型的类型(除void外)都可以定义转换函数。一般不允许转变为数组或函数类型。可以转换为指针以及引用类型。


注意:
-大部分操作符可以重载,不可重载的操作符有::  .*  .  ?:。
-也可以通过连接其他的合法符号创建新的操作符。例如,定义一个operator**提供幂运算是合法的。
-重载操作符必须具有一个类类型操作数。
-不能为内置数据类型重定义加号操作符。
-因为不保证操作数的求值顺序尤其是内置AND、OR、和逗号操作符的操作数求值。因此,重载&&、||都不是好的做法。
-类成员的重载函数,其形参看起来比操作数数目少1。因为成员函数的操作符有一个隐含的this形参,限定为第一个操作数。
-操作符定义为非成员函数时,通常必须将它们设置为操作类的友元。因为这种情况下,操作符通常需要访问类的私有成员。
-IO操作符必须为非成员函数,否则,左操作数将只能是该类类型的对象。
-赋值操作符可以重载,并且必须定义为成员函数,返回对*this的引用。

 

原创粉丝点击