请选择 进入手机版 | 继续访问电脑版

环信

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: mmap uikit gcc
查看: 295|回复: 0

C++操作符重载

[复制链接]

21

主题

43

帖子

140

积分

注册会员

Rank: 2

积分
140
发表于 2016-1-25 10:10:08 | 显示全部楼层 |阅读模式

1.
操作符重载:
    通过operator关键字可以利用函数扩展操作符, operator的本质是通过函数重载实现操作符重载
  1.         struct Complex
  2.         {
  3.             int a;
  4.             int b;
  5.         };
  6.         Complex operator+ (const Complex& c1, const Complex& c2)
  7.         {
  8.             Complex ret;
  9.             
  10.             ret.a = c1.a + c2.a;
  11.             ret.b = c1.b + c2.b;
  12.             
  13.             return ret;
  14.         }
  15.         int main(int argc, char *argv[])
  16.         {
  17.             Complex c1 = {1, 2};
  18.             Complex c2 = {3, 4};
  19.             Complex c3 = c1 + c2;
  20.             
  21.             cout<<"c3.a = "<<c3.a<<endl;
  22.             cout<<"c3.b = "<<c3.b<<endl;
  23.             return 0;
  24.         }       
复制代码

2.   
操作符重载用于类:
    通过friend关键字可以例外的开放权限
  1.         class Complex
  2.         {
  3.             int a;
  4.             int b;
  5.         public:
  6.             Complex(int a = 0, int b = 0)
  7.             {
  8.                 this->a = a;
  9.                 this->b = b;
  10.             }
  11.             
  12.             int getA()
  13.             {
  14.                 return a;
  15.             }
  16.             
  17.             int getB()
  18.             {
  19.                 return b;
  20.             }
  21.             
  22.             friend Complex operator+ (const Complex& c1, const Complex& c2);
  23.             friend ostream& operator<< (ostream& out, const Complex& c);
  24.         };
  25.        
  26.         ostream& operator<< (ostream& out, const Complex& c)
  27.         {
  28.             out<<c.a<<" + "<<c.b<<"i";
  29.             
  30.             return out;
  31.         }       
  32.         Complex operator+ (const Complex& c1, const Complex& c2)
  33.         {
  34.             Complex ret;
  35.             
  36.             ret.a = c1.a + c2.a;
  37.             ret.b = c1.b + c2.b;
  38.             
  39.             return ret;
  40.         }
  41.        
  42.         int main(int argc, char *argv[])
  43.         {
  44.             Complex c1(1, 2);
  45.             Complex c2(3, 4);
  46.             Complex c3 = c1 + c2;
  47.             
  48.             cout<<c1<<endl;
  49.                 cout<<c2<<endl;
  50.                 cout<<c3<<endl;
  51.             return 0;
  52.         }       
复制代码

3.
类的成员函数作为操作符重载的函数
    每个类有默认的赋值操作符
    默认的赋值操作符只是做简单的值复制
    类中存在指针成员变量时就需要重载赋值操作符
  1.         class Complex
  2.         {
  3.             int a;
  4.             int b;
  5.                 public:
  6.                     Complex(int a, int b)
  7.                     {
  8.                         this->a = a;
  9.                         this->b = b;
  10.                     }
  11.                     
  12.                     int getA()
  13.                     {
  14.                         return a;
  15.                     }
  16.                     
  17.                     int getB()
  18.                     {
  19.                         return b;
  20.                     }
  21.                     
  22.                     Complex operator+ (const Complex& c2);
  23.                     
  24.                     friend ostream& operator<< (ostream& out, const Complex& c);
  25.         };
  26.        
  27.         ostream& operator<< (ostream& out, const Complex& c)
  28.         {
  29.             out<<c.a<<" + "<<c.b<<"i";
  30.             
  31.             return out;
  32.         }
  33.        
  34.         Complex Complex::operator+ (const Complex& c2)
  35.         {
  36.             Complex ret(0, 0);
  37.             
  38.             ret.a = this->a + c2.a;
  39.             ret.b = this->b + c2.b;
  40.             
  41.             return ret;
  42.         }
  43.        
  44.         int main(int argc, char *argv[])
  45.         {
  46.             Complex c1(1, 2);
  47.             Complex c2(3, 4);
  48.             Complex c3 = c1 + c2;
  49.             
  50.             cout<<c1<<endl;
  51.             cout<<c2<<endl;
  52.             cout<<c3<<endl;
  53.             return 0;
  54.         }
复制代码

全局函数重载操作符 和 类的成员函数重载操作符 选择:
    当无法修改左操作数的类时,使用全局函数进行重载
    =, [], ()和->操作符只能通过成员函数进行重载
   
   
4.
单目运算符操作符的重载
    操作符只有一个操作数
    操作符有前缀和有后缀的区分   
   
通过一个占位参数来区分前置运算和后置运算:
  1.             Complex operator++ (int);
  2.             Complex& operator++();
  3.         Complex Complex::operator++ (int)
  4.         {
  5.             Complex ret = *this;
  6.             a++;
  7.             b++;
  8.             return ret;
  9.         }
  10.         Complex& Complex::operator++()
  11.         {
  12.             ++a;
  13.             ++b;
  14.             return *this;
  15.         }           
  16.        
  17.         Complex c1(1, 2);
  18.             Complex c2(3, 4);
  19.             Complex c3 = c2;
  20.         c2++;
  21.             ++c3;
复制代码

5.        
不要重载&&和||操作符
        &&和||内置实现了短路规则
    操作符重载是靠函数重载来完成的
    操作数作为函数参数传递
    C++的函数参数都会被求值,无法实现短路规则


例子:
Array.h

  1. #ifndef _ARRAY_H_
  2. #define _ARRAY_H_

  3. class Array
  4. {
  5. private:
  6.     int mLength;
  7.     int* mSpace;

  8. public:
  9.     Array(int length);
  10.     Array(const Array& obj);
  11.     int length();
  12.     ~Array();
  13.     int& operator[](int i);
  14.     Array& operator= (const Array& obj);
  15.     bool operator== (const Array& obj);
  16.     bool operator!= (const Array& obj);
  17. };
  18. #endif
复制代码

Array.cpp
  1. #include <stdio.h>
  2. #include "Array.h"

  3. Array::Array(int length)
  4. {
  5.     if( length < 0 )
  6.     {
  7.         length = 0;
  8.     }
  9.    
  10.     mLength = length;
  11.     mSpace = new int[mLength];
  12. }

  13. Array::Array(const Array& obj)
  14. {
  15.     mLength = obj.mLength;
  16.    
  17.     mSpace = new int[mLength];
  18.    
  19.     for(int i=0; i<mLength; i++)
  20.     {
  21.         mSpace[i] = obj.mSpace[i];
  22.     }
  23. }

  24. int Array::length()
  25. {
  26.     return mLength;
  27. }

  28. Array::~Array()
  29. {
  30.     mLength = -1;
  31.     printf("%08X\n", mSpace);
  32.     delete[] mSpace;
  33. }

  34. int& Array::operator[](int i)
  35. {
  36.     return mSpace[i];
  37. }

  38. Array& Array::operator= (const Array& obj)
  39. {
  40.     delete[] mSpace;
  41.    
  42.     mLength = obj.mLength;
  43.    
  44.     mSpace = new int[mLength];
  45.    
  46.     for(int i=0; i<mLength; i++)
  47.     {
  48.         mSpace[i] = obj.mSpace[i];
  49.     }
  50.    
  51.     return *this;
  52. }

  53. bool Array::operator== (const Array& obj)
  54. {
  55.     bool ret = true;
  56.    
  57.     if( mLength == obj.mLength )
  58.     {
  59.         for(int i=0; i<mLength; i++)
  60.         {
  61.             if( mSpace[i] != obj.mSpace[i] )
  62.             {
  63.                 ret = false;
  64.                 break;
  65.             }
  66.         }
  67.     }
  68.     else
  69.     {
  70.         ret = false;
  71.     }
  72.    
  73.     return ret;
  74. }

  75. bool Array::operator!= (const Array& obj)
  76. {
  77.     return !(*this == obj);
  78. }
复制代码

main.cpp
  1. #include <stdio.h>
  2. #include "Array.h"

  3. int main()
  4. {
  5.     Array a1(10);
  6.     Array a2(0);
  7.     Array a3(0);
  8.    
  9.     if( a1 != a2 )
  10.     {
  11.         printf("a1 != a2\n");
  12.     }
  13.    
  14.     for(int i=0; i<a1.length(); i++)
  15.     {
  16.         a1[i] = i + 1;
  17.     }
  18.    
  19.     for(int i=0; i<a1.length(); i++)
  20.     {
  21.         printf("Element %d: %d\n", i, a1[i]);
  22.     }
  23.    
  24.     a3 = a2 = a1;
  25.    
  26.     if( a1 == a2 )
  27.     {
  28.         printf("a1 == a2\n");
  29.     }
  30.    
  31.     for(int i=0; i<a2.length(); i++)
  32.     {
  33.         printf("Element %d: %d\n", i, a2[i]);
  34.     }
  35.     return 0;
  36. }
复制代码




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|环信 Glofty.com ( 粤ICP备15084637号 )

GMT+8, 2017-4-27 23:00 , Processed in 0.225602 second(s), 22 queries .

快速回复 返回顶部 返回列表