C++之双目/单目等运算符的重载

   1. 双目运算符重载

    1.1格式:

    L/*左操作数*/ # /*操作符*/ R/*右操作数*/
    L#R
      => L.operator#(R) 成员形式,写在类中,成员函数形式
      => operator#(L,R) 非成员形式 //需要定义为类的友元函数
    如:
      cout << c1;
        => cout.operator<<(c1)
        => operator<<(cout,c1)

    1.2实际操作形式:

    类名 operator+(const 类名& 对象名)
    { return 类名(...,....);//构建的一个匿名对象}
    类名 operator-(const 类名& 对象名)
    { return 类名(...,....);//构建的一个匿名对象}
    类名& operator+=(const 类名& 对象名)
    { return *this = *this + 对象名;}
    类名& operator-=(const 类名& 对象名)
    { return *this -= *this - 对象名;}

  2. 单目运算符的重载

  2.1格式:

      #/*操作符*/O/*操作数*/
      =>O.operator#();//成员形式
      =>operator#(O); //非成员形式
  如:

    cout << -c1 << endl;

      c1.operator-();//成员函数形式

      operator-(c1);//非成员函数形式

   2.2实际操作形式:

    类名 operator-(void)
    { return 类名(-...,-...);}
   注意:

    对于运算符重载的两种形式中,优先调用成员函数形式

 3.关于自增自减运算符的使用:

   (1) 前缀自增自减运算符

    a.表达式的值是增减以后的值
    b.运算函数返回的是操作数的引用
    c.成员函数形式的运算符函数没有参数,友元函数形式的运算符函数只有一个参数:操作数
    d.可以连用
    class A
   
{ A& operator++(){  ++m_r;++m_i;return *this;}};//成员函数形式
   

    A& operator(A& a)//友元函数形式
   
{
   
++m_r;++m_i;
   
return a;
   
}
   
注意:加引用就是为了连续使用;

   (2) 后缀自增自减运算符

    a.表达式的值是增减以前的值
    b.运算函数返回的是操作数增减以前的副本
    c.成员函数形式的运算符函数有int类型的哑元参数,友元函数形式的运算符函数有两个参数:操作数  和 哑元
    d.不可以连用
    class A
   
{ const A operator++(int){return(m_r++,m_i++);}};//成员函数形式
   

    const A operator++(A& a,int)//友元函数形式
   
{ return A(a.m_r++,a.m_i++);} 

   注意:加const就是为了防止连续运算

  4. 类型转换运算符函数

    4.1格式:

    源类型中定义如下形式的运算符函数

    operator 目标类型(void)
   
{
         
构造一个目标类型的对象返回(目标类型也可以是基本数据类型)
   

   功能:
   
将一个类的对象转换成另一个类型的数据,该函数没有返回值类型;
   注意:
 
如果在源类型中提供类型转换运算符函数的同时,在目标类型中定义支持类型转换的构造函数,对于隐式类型转换,系统会优先选择类型转换运算符函数完成转换,而对于显式类型转换系统优先选择构造函数(建议只提供构造函数即可,因为可以使用explicit 关键字修饰构造函数,表示该构造函数只能用于显示类型转换,从而防止潜在的错误;)
  扩展:
  如果一个类类型对象和一个基本数据类型运算时,怎么处理?
  Complex c(2,3);
  cout << "c + 100 " << c + 100 << endl;//c.operator+(100);

5.不允许用户重载的运算符

  ::作用域解析操作符
  . 成员访问操作符
  .* 成员指针解引用
  ?: 三目运算符
  sizeof 字节长度运算符
  typeid 类型信息操作符
 注意:
  (1)操作符的操作数中没有类类型的操作数时,不能重载
  (2)不能通过运算符重载去发明新的操作符,比如:**

 6.只能定义为成员函数的运算符

   (1)下标操作符[] (见代码xibiao.cpp)//

     //支持下标运算符的重载
     int operator[](int n)
     { return m_data[n];}

   (2)函数操作符() (见代码funOperator.cpp)//

      class Square
      {public://支持()运算符重载
   int operator()(int n)
   {return n*n;}};

   (3)间接操作符*,->  (见代码 jianjie.cpp)//智能指针类

 //智能指针类
class PA
{private:A* m_pa;
 public:PA(A* pa):m_pa(pa){}
  ~PA(void)
    {delete m_pa;m_pa = NULL;}
    //支持->运算符函数
    A* operator->(void)
    {return m_pa;}
    //支持*运算符重载
    A& operator*(void)
    { return *m_pa;}};

 7.new / delete 运算符的重载

  应用:
       一般把构造函数调用之前的初始化工作放在new运算符的重载函数中

       一般把析构函数调用之后的善后工作放在delete运算符的重载函数中

例子://new []运算符进行重载
    static void* operator new[](size_t size)
    {void* p = malloc(size);cout << "我自己的New[]:size = " << size << ",p = " << p << endl;return p;}
    // delete[] 运算符重载
    static void operator delete[](void* p)
    {cout << "我自己的delete[]:p = " << p << endl;free(p);}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值