流沙团
c++运算符重载总结
2017-12-1 流沙团


很全面的总结,



转载: 



https://wuyuans.com/2012/09/cpp-operator-overload







文章如下











c++的一大特性就是重载(overload),通过重载可以把功能相似的几个函数合为一个,使得程序更加简洁、高效。在c++中不止函数可以重载,运算符也可以重载。由于一般数据类型间的运算符没有重载的必要,所以运算符重载主要是面向对象之间的。



1.一般运算符重载


在进行对象之间的运算时,程序会调用与运算符相对应的函数进行处理,所以运算符重载有两种方式:成员函数和友元函数。成员函数的形式比较简单,就是在类里面定义了一个与操作符相关的函数。友元函数因为没有this指针,所以形参会多一个。
	





  1. class A



  2. {



  3. public:



  4. A(int d):data(d){}



  5. A operator+(A&);//成员函数



  6. A operator-(A&);



  7. A operator*(A&);



  8. A operator/(A&);



  9. A operator%(A&);



  10. friend A operator+(A&,A&);//友元函数



  11. friend A operator-(A&,A&);



  12. friend A operator*(A&,A&);



  13. friend A operator/(A&,A&);



  14. friend A operator%(A&,A&);



  15. private:



  16. int data;



  17. };



  18. //成员函数的形式



  19. A A::operator+(A &a)



  20. {



  21. return A(data+a.data);



  22. }







  23. A A::operator-(A &a)



  24. {



  25. return A(data-a.data);



  26. }







  27. A A::operator*(A &a)



  28. {



  29. return A(data*a.data);



  30. }







  31. A A::operator/(A &a)



  32. {



  33. return A(data/a.data);



  34. }







  35. A A::operator%(A &a)



  36. {



  37. return A(data%a.data);



  38. }



  39. //友元函数的形式



  40. A operator+(A &a1,A &a2)



  41. {



  42. return A(a1.data+a2.data);



  43. }







  44. A operator-(A &a1,A &a2)



  45. {



  46. return A(a1.data-a2.data);



  47. }







  48. A operator*(A &a1,A &a2)



  49. {



  50. return A(a1.data*a2.data);



  51. }







  52. A operator/(A &a1,A &a2)



  53. {



  54. return A(a1.data/a2.data);



  55. }







  56. A operator%(A &a1,A &a2)



  57. {



  58. return A(a1.data%a2.data);



  59. }







  60. //然后我们就可以对类的对象进行+、-、*、/了。



  61. void main(void)



  62. {



  63. A a1(1),a2(2),a3(3);



  64. a1=a2+a3;



  65. //或者



  66. a1=a2.operator+(a3);



  67. }





注意:在进行a2+a3的时候会出错,因为我们在上面对+定义了两种方法,去掉一种即可。



2.关系运算符重载


因为函数体比较简单,后面我就只给出成员函数形式的函数声明了,关系运算符有==,!=,<,>,<=,>=。
	





  1. bool operator == (const A& );



  2. bool operator != (const A& );



  3. bool operator < (const A& );



  4. bool operator <= (const A& );



  5. bool operator > (const A& );



  6. bool operator >= (const A& );





3.逻辑运算符重载


	





  1. bool operator || (const A& );



  2. bool operator && (const A& );



  3. bool operator ! ();





4.单目运算符重载


这里的+、-是正负的意思,放在对象前面。
	





  1. A& operator + ();



  2. A& operator - ();



  3. A* operator & ();



  4. A& operator * ();





5.自增减运算符重载


++和–根据位置的不同有四种情况,都可以重载。
	





  1. A& operator ++ ();//前置++



  2. A operator ++ (int);//后置++



  3. A& operator --();//前置--



  4. A operator -- (int);//后置--





6.位运算符重载


按位操作。
	





  1. A operator | (const A& );



  2. A operator & (const A& );



  3. A operator ^ (const A& );



  4. A operator << (int i);



  5. A operator >> (int i);



  6. A operator ~ ();





7.赋值运算符重载


没有=哦。
	





  1. A& operator += (const A& );



  2. A& operator -= (const A& );



  3. A& operator *= (const A& );



  4. A& operator /= (const A& );



  5. A& operator %= (const A& );



  6. A& operator &= (const A& );



  7. A& operator |= (const A& );



  8. A& operator ^= (const A& );



  9. A& operator <<= (int i);



  10. A& operator >>= (int i);





8.内存运算符重载


	





  1. void *operator new(size_t size);



  2. void *operator new(size_t size, int i);



  3. void *operator new[](size_t size);



  4. void operator delete(void*p);



  5. void operator delete(void*p, int i, int j);



  6. void operator delete [](void* p);





9.特殊运算符重载


上面的运算符重载都有两种方式,而下面的运算符只能用一种,特殊吧。 这些运算符的重载只能是成员函数。




  1. A& operator = (const A& );



  2. char operator [] (int i);//返回值不能作为左值



  3. const char* operator () ();



  4. T operator -> ();







  5. //类型转换符



  6. operator char* () const;



  7. operator int ();



  8. operator const char () const;



  9. operator short int () const;



  10. operator long long () const;



  11. //还有很多就不写了





而这些只能以友元函数的形式重载






  1. friend inline ostream &operator << (ostream&, A&);//输出流



  2. friend inline istream &operator >> (istream&, A&);//输入流





10.总结


两种重载方式的比较:

注意事项:


  1. 除了类属关系运算符”.“、成员指针运算符”.*“、作用域运算符”::“、sizeof运算符和三目运算符”?:“以外,C++中的所有运算符都可以重载。


  2. 重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。


  3. 运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。


  4. 重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。


  5. 运算符重载不能改变该运算符用于内部类型对象的含义。它只能和用户自定义类型的对象一起使用,或者用于用户自定义类型的对象和内部类型的对象混合使用时。


  6. 运算符重载是针对新类型数据的实际需要对原有运算符进行的适当的改造,重载的功能应当与原有功能相类似,避免没有目的地使用重载运算符。





发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容