当前位置:   article > 正文

c++ 程序设计 week4 运算符重载_程序设计四则运算符重载代码

程序设计四则运算符重载代码

运算符重载

这一周的内容主要讲运算符重载, 但是如何设计返回值类型,以及是否需要采用成员函数都是很重要的。


1. 赋值运算符重载

T & operator=(T  &a); 

与copy constructor类类似, 但是存在返回值.

(1) 成员函数:只能定义成成员函数。

(2)返回值:而且返回值类型必须是引用,才能符合我们对等号的直观理解。(a = b) = c 还会将a改变, 所以我们需要返回T&。

(3)类内存在指针时需要注意如果右边赋值和本身相同时,不需要重新赋值; 而且如果原来为空指针,那么也可以直接赋值,  以上两种类型都需要先判断,以防delete时出现错误.



2. 运算符重载位友元函数

T operator+(const T &a, const T &b)

如果我们把函数重载为外部函数, 那么在内部设置为友元函数可以访问成员的私有member.



3. 流输入,输出函数

输出:

ostream & operator<< (ostream &os, const T & a);

(1)返回类型: &ostream, (保证流的一致性)

(2)外部重载函数, 因为我们需要 ostream << , 如果设置为内部函数则无法调用.

输入函数类似.


4. ++ ,--

前置++T: T operator++()

后置T++: T operator++(int)



所以下面用了国外一门课的例子.

例子MyString

#MyString.h
  1. #ifndef __MYSTRING_H__
  2. #define __MYSTRING_H__
  3. #include <iostream>
  4. using namespace std;
  5. class MyString {
  6. public:
  7. // default constructor
  8. MyString();
  9. // constructor
  10. MyString(const char* p);
  11. // destructor
  12. ~MyString();
  13. // copy constructor
  14. MyString(const MyString& s);
  15. // copy assignment
  16. MyString& operator=(const MyString& s);
  17. // returns the length of the string
  18. int length() const { return len; }
  19. friend int operator==(const MyString& s1,const MyString& s2);
  20. friend int operator!=(const MyString& s1,const MyString& s2);
  21. friend int operator>(const MyString& s1,const MyString& s2);
  22. friend int operator<(const MyString& s1,const MyString& s2);
  23. friend int operator>=(const MyString& s1,const MyString& s2);
  24. friend int operator<=(const MyString& s1,const MyString& s2);
  25. MyString& operator+=(const MyString &s);
  26. // put-to operator
  27. friend ostream& operator<<(ostream& os, const MyString& s);
  28. // get-from operator
  29. friend istream& operator>>(istream& is, MyString& s);
  30. // operator[]
  31. char& operator[](int i);
  32. // operator[] const
  33. const char& operator[](int i) const;
  34. private:
  35. char* data;
  36. int len;
  37. };
  38. MyString operator+(const MyString& s1, const MyString& s2);
  39. #endif

#MyString.cpp
  1. #include <cstring>
  2. #include <cstdio>
  3. #include "mystring.h"
  4. // default constructor
  5. MyString::MyString()
  6. {
  7. data = new char[1];
  8. data[0] = '\0';
  9. len = 0;
  10. }
  11. // constructor
  12. MyString::MyString(const char* p)
  13. {
  14. if (p) {
  15. len = strlen(p);
  16. data = new char[len+1];
  17. strcpy(data, p);
  18. } else {
  19. data = new char[1];
  20. data[0] = '\0';
  21. len = 0;
  22. }
  23. }
  24. // destructor
  25. MyString::~MyString()
  26. {
  27. delete[] data;
  28. }
  29. // copy constructor
  30. MyString::MyString(const MyString& s)
  31. {
  32. len = s.len;
  33. data = new char[len+1];
  34. strcpy(data, s.data);
  35. }
  36. // copy assignment
  37. MyString& MyString::operator=(const MyString& rhs)
  38. {
  39. #ifdef BASIC4TRACE
  40. fprintf(stderr, "BASIC4TRACE: (%p)->op=(const MyString&)\n", this);
  41. #endif
  42. if (this == rhs) {
  43. return *this;
  44. }
  45. // first, deallocate memory that 'this' used to hold
  46. delete[] data;
  47. // now copy from rhs
  48. len = rhs.len;
  49. data = new char[len+1];
  50. strcpy(data, rhs.data);
  51. return *this;
  52. }
  53. //+=operator
  54. MyString& MyString::operator+=(const MyString &s)
  55. {
  56. len = len + s.len;
  57. char *temp = new char[len+1];
  58. strcpy(temp,data);
  59. strcat(temp,s.data);
  60. delete[] data;
  61. data = temp;
  62. return *this;
  63. }
  64. // operator+
  65. MyString operator+(const MyString& s1, const MyString& s2)
  66. {
  67. #ifdef BASIC4TRACE
  68. fprintf(stderr,
  69. "BASIC4TRACE: op+(const MyString&, const MyString&)\n");
  70. #endif
  71. MyString temp = s1;
  72. temp += s2;
  73. return temp;
  74. }
  75. // put-to operator
  76. ostream& operator<<(ostream& os, const MyString& s)
  77. {
  78. os << s.data;
  79. return os;
  80. }
  81. // get-from operator
  82. istream& operator>>(istream& is, MyString& s)
  83. {
  84. // this is kinda cheating, but this is just to illustrate how this
  85. // function can work.
  86. string temp;
  87. is >> temp;
  88. delete[] s.data;
  89. s.len = strlen(temp.c_str());
  90. s.data = new char[s.len+1];
  91. strcpy(s.data, temp.c_str());
  92. return is;
  93. }
  94. // operator[] - in real life this function should be declared inline
  95. char& MyString::operator[](int i)
  96. {
  97. return data[i];
  98. }
  99. // operator[] const - in real life this should be inline
  100. const char& MyString::operator[](int i) const
  101. {
  102. // illustration of casting away constness
  103. return ((MyString&)*this)[i];
  104. }
  105. int operator==(const MyString& s1,const MyString& s2)
  106. {
  107. return (strcmp(s1.data,s2.data)==0);
  108. }
  109. int operator!=(const MyString& s1, const MyString& s2)
  110. {
  111. return (strcmp(s1.data,s2.data)!=0);
  112. }
  113. int operator<(const MyString& s1,const MyString& s2)
  114. {
  115. return (strcmp(s1.data,s2.data)<0);
  116. }
  117. int operator>(const MyString& s1,const MyString& s2)
  118. {
  119. return(strcmp(s1.data,s2.data)>0);
  120. }
  121. int operator<=(const MyString& s1,const MyString& s2)
  122. {
  123. return(strcmp(s1.data,s2.data)<=0);
  124. }
  125. int operator>=(const MyString& s1,const MyString& s2)
  126. {
  127. return(strcmp(s1.data,s2.data)>=0);
  128. }











声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/806836
推荐阅读
相关标签
  

闽ICP备14008679号