• 13. 运算符重载(一)


    运算符重载:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型

    • 对于内置的数据类型的表达式的运算符是不可能改变的

    • 可以通过自己写成员函数,实现两个对象相加属性后返回信的对象
    Person Personaddperson(Person &p)
    {
          Person temp;
          temp m_A = this->m_A + p.m_A;
          temp m_B = this->m_B + p.m_B;
          return temp;
    }
    
    • 编译器这时想:你有 + 号 我也有,还不如我自己起一个通用名称 ————> 通过函数函数重载 + 号
    Person operator+(Person &p)
    {
          Person temp;
          temp m_A = this->m_A + p.m_A;
          temp m_B = this->m_B + p.m_B;
          return temp;
    }
    
    • 调用时
      Person p3 = p1.operator +(p2) 简化为 Person p3 = p1 + p2
    • 当然也可以通过全局函数来重载

    1. 加号运算符重载

    #include <iostream>
    using namespace std;
    class Person 
    {
    public:
          //1. 成员函数重载 + 号
          Person operator+(Person &p)
          {
                Person temp;
                temp m_A = this->m_A + p.m_A;
                temp m_B = this->m_B + p.m_B;
                return temp;
          }
    
          int m_A;
          int m_B;
    };
    
    //2. 全局函数重载 + 号
    Person operator+(Person &p1,Person &p2)
    {
          Person temp;
          temp.m_A = p1.m_A + p2.m_A;
          temp.m_B = p1.m_B + p2.m_B;
          return temp;
    }
    
    //3. 函数重载版本
    Person operator+(Person &p1,int num)
    {
          Person temp;
          temp.m_A = p1.m_A + num;
          temp.m_B = p1.m_B + num;
          return temp;
    }
    
    void test01() //通过成员函数重载+号
    {
          Person p1;
          p1.m_A = 10;
          p1.m_B =10;
          Person p2;
          p2.m_A = 10;
          p2.m_B = 10;
    
          // 成员函数的本质调用 Person p3 = p1.operator+(p2);
          // 全局函数重载本质调用 Person p3 = operator+(p1,p2);
          Person p3=p1+p2;  
          
          //运算符重载也可以发生函数重载:例如 Person + int
          Person p4 = p1 + 100;
          cout << "p3.m_A" << p3.m_A <<endl;
          cout << "p3.m_B" << p3.m_B <<endl;
    }
    int main()
    {
          test01();
          system("pause");
          return 0;
    }
    

    2. 左移运算符

    作用:可以输出自定义数据类型
    目的:知道怎么通过输出对象,打印出对象所有属性的值
    提问:

    • 当类中的成员变量为私有属性怎么能让全局函数访问该变量 ?
    • 为什么最好不要用成员函数来重载左移运算符 ?
    #include <iostream>
    using namespace std;
    class Person 
    {
    public:
          //利用成员函数重载 左移运算符
          //通常不会利用成员函数重载 << 运算符,因为无法实现 cout 在左侧 ——> p.operator(cout) = p << cout
          
          int m_A;
          int m_B;
    };
    
    // 只能利用全局函数重载左移运算符
    // 如果当类中成员变量为私有属性时可以利用友元来访问
    //cout 为标准输出流对象,这里为什么用引用呢?cout 该对象全局只能有一个;当然不要忘记引用的本质就是“起别名”,这里的cout 可以替换成其他的。
    ostream & operator<<( ostream &cout,Person &p) 
    {
          cout <<"m_A = " << p.m_A << "m_B ="<< p.m_B;
          return cout;
    }
    void test02()
    {
          Person p;
          p.m_A = 10;   //当类成员变量为私有属性时,可以通过构造函数来进行赋值操作
          p.m_B = 10;
          cout << p << endl;  // 注意这里如果全局函数返回值为 void 由于链式调用的思想会报错,
                              // 当然了你也可以把左移运算符当作前面的加号重载,该运算符左右两边一定要有变量。
    }
    int main()
    {
          test02();
          system("pause");
          return 0;
    }
    
  • 相关阅读:
    [IOS]《A Swift Tour》翻译(一)
    Android Property Animation动画
    [Android]AndroidBucket增加碎片SubLayout功能及AISubLayout的注解支持
    使用spin.js优化等待ajax返回时的页面效果
    用adb命令组装PowerShell实用小工具——Android测试小助手
    测试团队专业化建设规范建议与素质养成指南
    用Python脚本在豆瓣音乐人小站上下载未开放下载的歌曲
    Java调用Python脚本工具类
    Python爬网——获取安卓手机统计数据
    JIRA REST java client API实际应用
  • 原文地址:https://www.cnblogs.com/BY1314/p/12873984.html
Copyright © 2020-2023  润新知