• 运算符重载


    运算符重载本质:函数调用

    实现方法:将基本类型进行封装,提供一个接口。

    complex C4 = C1 + C2;
    重写 operator+这个函数即可。(返回值是complex)

    实现函数重载步骤:
    1、承认操作符重载是一个函数,写出函数名称
    2、根据操作数,写出函数参数
    3、确定返回值(引用,指针,元素)及实现函数业务

    二元运算符重载:
    以复数相加为例:
    全局函数法:
    complex operator+(complex &C1, complex &C2) {}
    当成员a和b为私有成员数据时,应该把这个函数声明为complex类是友元函数;
    成员函数法:(成员函数隐含this指针)
    由调用方法C1.operator+(C2)倒推:成员函数隐含this指针,指向C1对象的地址,所以参数只传入一个C2的引用即可。
    complex operator+(&C2)
    {
      complex tem(this->a + C2.a, this->b + C2.b);
      return tem;
    }

    一元运算符重载:
    ++a --a (前置)
    成员函数:
    complex& operator--()
    {
      this->a--;
      this->b--;
      return *this;
    }
    complex& operator--(complex& _c)
    {
      _c.a--;
      _c.b--;
      return -c;
    }
    a++ a--(后置)
    运算符重载:参数个数,参数类型,不同类型参数顺序
    前置已经写了这种方法,后置由C++提供的占位符(哑元)来实现参数个数的不同
    全局函数:
    complex operator++(complex& C1, int) //声明为类的友元函数
    {
      complex tem = C1;
      C1.a++;
      C2.b++;
      return tem;
    }
    成员函数:
    complex operator--(int)
    {
      complex tem(this->a,this->b);
      this->a--;
      this->b--;
      return tem;
    }

    以上主要使用成员函数的方法实现,以下看一下需要友元函数的情景。
    重载 << >> 左右移 输入输出
    友元函数法:
    void operator<<(ostream& out, complex& c1) //在类中声明为友元
    {
      out<<c1.a << "+" << c1.b << "i" << endl;
    }
    而使用成员函数法,需要在cout的类ostream中声明成员函数,而ostream的源码未知。。。
    cout << C1;可用
    但cout << C1 << "afs";不可用,提示operator<<,左操作数包含“void类型
    输出流<<左结合,cout << C1 << "afs"转换为void << "afs";
    所以函数返回不能为空,返回一个引用,才可以当左值,支持链式编程。
    ostream& operator<<(ostream& out, complex& c1) //在类中声明为友元
    {
      out<<c1.a << "+" << c1.b << "i" << endl;
    }

    成员函数一般用于左右操作数类型不一样的情景;
    对于+,需要使用友元函数方法才能保证34+C1和C1+34都可用。
    34不是对象,没法通过调用成员函数。

    C++规定不能用友元函数重载 = () [] ->

    类中有指针时,避免浅拷贝,重载 =
    步骤:
    1、先释放内存
    2、申请内存
    3、返回引用(支持链式编程)
    Name& operator=(Name &obj1) //= 是右结合性
    {
         if(this->m_p != NULL) //待赋值对象的指针成员先释放掉,避免内存泄漏
    {
          delete [] m_p;
          m_len = 0;
    }
      this->m_len = obj1.m_len;
      this->m_p = new char [m_len+1];
      strcpy(m_p, obj1.m_p); //数组名是字符串首地址。strcpy(this->m_p, obj1.m_p)也可以
      return *this;
    }

    && || 函数重载无法实现短路规则,一般不重载
    t1 && (t1+t2)
    t1.operator&&(t1.operator+(t2))

  • 相关阅读:
    Qt中修改QtoolTip的样式
    字符编码笔记:ASCII、Unicode和UTF-8
    UML类图关系模式(C++代码说明)
    sql标签和include标签的使用
    mybatis动态SQL标签的用法
    <!CDATA[ ....... ]] > 用法详解
    Mybatis 中$与#的区别
    枚举
    ExtJs如何判断form表单是否被修改过详解
    Extjs二级联动combo省城市
  • 原文地址:https://www.cnblogs.com/Lunais/p/5676289.html
Copyright © 2020-2023  润新知