第四十三篇,C++的运算法重载语法实现

匿名对象
==================================================
   1.概念
         你创建了对象,但是该对象没有名字
   
   2.实际开发中的作用
         第一:匿名对象作为函数的返回值
         第二:匿名对象作为函数的实参


运算符重载
==================================================
   1.概念
         C++提供一种机制,允许程序员扩展运算符号的功能
         比如:加法运算--》正常情况只能用于,整数,小数,字符
               重载加法运算--》可以实现加法运算作用于猫的对象.....其他你想要使用的场合

   2.语法规则
         运算符重载的本质:就是一个函数,程序员自定义一个函数,通过该函数实现运算符功能的扩展
         返回值类型 operator运算符号(形参)
         {

              具体代码

         }
         例如:我想在猫类中重载加法运算--》让两只猫可以年龄相加
                  int operator+(Cat &other)
                  {
                       return this->age+other.age;
                  }
     运算符重载的特点:
         特点一:运算符重载,函数名字很奇怪,统一叫做operator运算符号
                  返回值 operator+(形参)
                  返回值 operator*(形参)
                  返回值 operator[](形参)
                  返回值 operator()(形参)
         特点二:运算符重载不要改变运算符的语义(行业潜规则,不是语法要求)
                   比如:加法运算在我们心目中一般是用来相加,合并
         特点三:以下运算符不能重载         
                   ?:   ::  .  sizeof

    3.运算符重载有两种表现形式
       针对猫的对象
          问题一:
                  c1+4;  //等价于c1.operator+(4)
                  4+c1;  //尴尬了,写不出来  4.operator+(c1)是错误的
          解决方法:
                  第一种:运算符重载为类的成员函数
                  第二种:运算符重载为类的友元函数(非成员函数,是个普通函数)
          总结:
                  运算符重载为类的成员函数,默认是可以使用this指针,意味着函数可以少一个参数
                  运算符重载为类的友元函数,默认是不可以使用this指针,意味着函数需要把所有的参数都写上  
                  绝大部分情况下,你使用两种重载形式都是可以的
                  结论:如果可以用对象来调用--》你写成成员函数/友元函数都可以
                        不可以用对象调用--》你只能写成友元函数

          问题二:
                  int result=4+c1;
                      int operator+(int,Cat &);
                  Cat c2=4+c1;   
                      Cat operator+(int,Cat &);

    4.运算符重载,在等价表示的时候有两种等价形式
         比如:c1+c2;  //人类思维习惯
                等价于:c1.operator+(c2);   //此时operator+一定是Cat类的成员函数
                等价于:operator+(c1,c2);   //此时operator+一定是Cat类的友元函数(普通函数) 
         比如:4+c1;   //人类思维习惯
                等价于:operator+(4,c1);   //此时operator+一定是Cat类的友元函数(普通函数)  

    5.重新认识string,cout,cin
         (1)string类重载了哪些运算符
              string str3=str1+str2;  //重载了加法运算
              cout<<str1<<endl;       //重载<<
              cin>>str1;              //重载>>
              str1[1]                 //重载[],等价于str1.operator[](1);
         (2)ostream类重载了哪些运算符
              重载<< (C语言把这个符号叫做左移,C++重载为输出)
              //写法一:人类的思维习惯
                  cout<<a<<b<<endl;
                  连续输出的原理(跟连续做加法的原理一样--》嵌套)
                      第一步:先输出a
                              cout<<a  //cout.operator<<(a); 返回cout的引用
                      第二步:继续输出b
                              cout引用<<b 
                      第三步:继续输出回车
                              cout引用<<endl  
              //写法二:按照函数调用写法
                  cout.operator<<(a).operator<<(b).operator<<(endl);
         (3)istream类重载了哪些运算符
              重载>> (C语言把这个符号叫做右移,C++重载为输入)
              //写法一:人类的思维习惯
                  cin>>a>>b;
                  连续输入的原理(跟连续做加法的原理一样--》嵌套)
                      第一步:先输入a
                              cin>>a  //cin.operator>>(a); 返回cin的引用
                      第二步:继续输入b
                              cin引用>>b       
              //写法二:按照函数调用写法
                  cin.operator>>(a).operator>>(b);
              
    6.几种特殊的运算符重载
         (1)自增,自减重载
                  后置的自增:  operator++(int)  参数为了跟前置的++区分
                  前置的自增:  operator++()   
                  后置的自减:  operator--(int)  参数为了跟前置的--区分
                  前置的自减:  operator--()        
         (2)输入>>,输出<<重载    


练习
==================================================
   1.定义矩形类,重载加法运算--》要求
         Rect r1(宽,高);
         Rect r2=r1+4;  //r1+4表示把矩形的宽高都+4,然后赋值给r2
                        //等价于Rect r2=r1.operator+(4);

     思考:
           Cat c3=c1+c2; //如何写
           Cat c4=c1+c2+c3; //如何写,连续加可以拆分理解
                              先计算c1+c2 --》结果
                              在用上一步结果+c3
           人类思维习惯
           Cat c4=c1+c2+c3; 
           翻译成函数调用
               翻译一:当成类的成员函数
                       Cat temp=c1.operator+(c2)
                       Cat c4=temp.operator+(c3)   
                       //合并成一步,了解
                       c1.operator+(c2).operator+(c3)
               翻译二:当成类的友元函数
                       Cat temp=operator+(c1,c2)   
                       Cat c4=operator+(temp,c3)
                       //合并成一步,了解
                       operator+(operator+(c1,c2),c3)
   2.猫里面重载++运算符
            要求:
                  Cat c1(5);
                  Cat c2=c1++; //后置++
                  Cat c3=++c1; //前置++
   3.cout连续输出多只猫的信息
     尝试写出cin从键盘获取猫的信息
         cin>>c1;  //cin.operator>>(c1); //错误的
                     operator>>(cin,c1); //正确的


 

练习:
   1.如何实现
         Cat c5=c1+4+c2+c3+5+c4;
            分析思路:
                 
   2.定义时间class Time
          Time t1(时分秒);
          Time t2(时分秒);   
          Time t3=t1+t2;  //秒大于60,分钟大于60  小时>24提醒过了一天
  
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖爱Kun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值