分享

c++学习笔记(九):运算符重载进阶

 雪柳花明 2016-11-15

前面学过用友元关键字修饰全局函数来对运算符进行重载。

下面介绍用类的函数成员来进行函数重载:

  1. class Complex  
  2. {  
  3. public:  
  4.     Complex(int a, int b)  
  5.     {  
  6.         this->a = a;  
  7.         this->b = b;  
  8.     }  
  9.     void printCom()  
  10.     {  
  11.         cout<<a<<" + "<<b<<"i "<<endl;  
  12.     }  
  13.       
  14.     //通过成员函数完成前置++  
  15.     Complex& operator++()  
  16.     {  
  17.         this->a++;  
  18.         this->b++;  
  19.         return *this;  
  20.     }  
  21.   
  22.       
  23.     //通过类成员函数完成后置++  
  24.     Complex operator++(int)  
  25.     {  
  26.         Complex tmp = *this;  
  27.         this->a++;  
  28.         this->b++;  
  29.         return tmp;  
  30.     }  
  31.   
  32. private:  
  33.     int a;  
  34.     int b;  
  35. };  
  36.   
  37. void Test1()  
  38. {  
  39.   
  40.     Complex c1(1, 2);  
  41.   
  42.     //前置++   
  43.     ++c1;   
  44.     c1.printCom();  
  45.   
  46.     //后置++   
  47.     c1++;   
  48.     c1.printCom();  
  49.   
  50.     system("pause");  
  51. }  

注:1、前置++与后置++的返回值是不同的,前者需要先完成自加再取值,因此需要完成自加自后将自己返回(采用引用做返回值),后者需要先取值再加加,因此需要先定义一个临时变量缓存当前值,然后在对自身加加,最后返回的是临时变量即未自加之前的值。

  2、前置++与后置++的函数参数也是不同的:前置++:Complex& operator++();后置++Complex operator++(int),为了区别前置和后置的,在后置里要加个占位符。


那什么情况下用带友元关键字的全局函数重载操作符?什么情况下用类的成员函数重载操作符呢?

先看个例子:

此声明语句放到上面类里面:

  1. friend ostream& operator<<(ostream &out, Complex &c1);  

<<运算符重载用友元关键字修饰的全局函数:

  1. ostream& operator<<(ostream &out, Complex &c1)  
  2. {  
  3.     out<<c1.a<<" + "<<c1.b<<"i "<<endl;  
  4.     return out;  
  5. }  
ostream是什么鬼??



为什么他要用友元函数重载呢?? 那你用类成员函数重载试试,你可以再ostream类里添加这个重载类成员函数吗?肯定不能因此这种情况乖乖用友元函数吧。

看看测试函数吧:


  1. void Test2()  
  2. {  
  3.     Complex c1(1, 2);  
  4.     int a = 10;  
  5.     char *p = "addddd";  
  6.     cout<<"a"<<a<<endl;  
  7.     cout<<"p"<<p<<endl;  
  8.   
  9.     //Complex自定义类型 :a + bi   
  10.     cout<<c1;  
  11.     //不用类成员函数  
  12.     //因为你没有方法拿到cout这个类的源码  
  13.     //cout.operator<<(c1);  
  14.   
  15.     //返回值用引用 支持链式编程  
  16.     cout<<c1<<"abcc";  
  17.   
  18.     //函数返回值当左值,要求返回一个引用。  
  19.       
  20.     //上式相当于:cout.operator<<(c1).operator<<("abcd");  
  21.   
  22.   
  23. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多