运算符2

流过昼夜 提交于 2019-11-27 20:59:06

补充上一部分的运算符 这次写了这一些运算符 等于==  赋值= 箭头-> 括号运算符 () 输出运算符>>

  1 #include<iostream>
  2 #include<string> //string类  存放字符串
  3 using namespace std;
  4 class myString
  5 {
  6     char*str;//指针  用于存放字符串
  7     int size;//用来管理堆内存的大小 判断内存是否足够
  8 public:
  9     myString()
 10     {
 11         size = 1;
 12         str = new char[1]{'\0'};//放入一个'\0'
 13     }
 14     myString(char* string)//拷贝构造
 15     {
 16         size = strlen(string) + 1;        //+1的目的是存放\0
 17         str = new char[strlen(string) + 1];
 18         strcpy(str, string);//拷贝过程
 19     }
 20     ~myString()
 21     {
 22         if (str != nullptr)
 23         {
 24             delete[] str;
 25             str = nullptr;
 26         }
 27     }
 28     friend bool operator==(const myString&a, const char*b)//重载==运算符
 29     {
 30         return strcmp(a.str, b) == 0;//比较两个字符串
 31     }
 32     friend ostream&operator<<(ostream& os, myString& st)//友元重载输出运算符
 33     {
 34         os << st.str;
 35         return os;
 36     }
 37     //返回值是对象   可以返回引用
 38     friend myString& operator+=(myString& st, const char a[])//友元重载+=运算符 +=需要修改值不能用const 
 39     {
 40         if (strlen(st.str) + strlen(a) + 1 >st.size)//判断内存是否足够
 41         {
 42             st.size = strlen(st.str) + strlen(a) + 1;
 43             char*p = new char[st.size];//准备足够的内存
 44             strcpy(p, st.str);//原先内容拷贝过来
 45             delete[] st.str;
 46             st.str = p;//新内存地址赋值给str
 47         }
 48         strcat(st.str, a);//把字符串连接起来
 49     }
 50 
 51     //重载=  使用成员函数 
 52     myString&operator=(const char*a)
 53     {
 54         //如果是赋值nullprt可以另外加上比较去处理
 55         if (strlen(a) + 1 > size)
 56         {
 57             size = strlen(a) + 1;
 58             delete[] str;//释放原内存
 59             str = new char[size];
 60         }
 61         strcpy(str, a);//拷贝内容
 62         return *this;//this加*代表 当前对象
 63     }
 64 
 65 };
 66 
 67 //你怎么写的  限制了用户如何去使用
 68 struct st{ int x; int y; };
 69 class A
 70 {
 71     st stu;//结构体类型 成员变量
 72 public:
 73     st* operator->()        //->箭头运算符 
 74     {
 75         return &stu;
 76     }
 77     void operator()()        //重载的括号运算符  operator()
 78     {
 79         cout << "函数1" << endl;
 80     }
 81     void operator()(int x)
 82     {
 83         cout << "函数2" << endl;
 84     }
 85     int operator()(int x, int y)
 86     {
 87         cout << "函数3" << endl;
 88         return 1;
 89     }
 90 
 91     void* operator new(size_t size)//这个size是申请内存的大小  单位是字节
 92     {
 93         //size是自动计算好了的 不需要管
 94         cout << "调用new" << endl;
 95         return malloc(size);//申请内存
 96     }
 97 
 98     void operator delete(void *p)
 99     {
100         cout << "调用delete" << endl;
101         free(p);
102     }
103     void* operator new[](size_t size)
104     {
105         return malloc(size);
106     }
107     void operator delete[](void *p)
108     {
109         cout << "调用delete[ ]" << endl;
110         free(p);
111     }
112 };
113 
114 
115 /*
116 new 申请内存  调用构造函数  返回地址 3种操作
117 delete  调用析构   释放内存  2种操作
118 
119 重载new 只能申请内存这个操作        可以直接使用malloc操作
120 重载delete 只能释放内存这个操作    可以使用free操作
121 
122 
123 new  new[]
124 delete  delete[]
125 */
126 int main()
127 {
128     A *p = new A;
129     delete p;
130 
131     p = new A[10];
132     delete[] p;
133 
134 
135     A a;//对象
136     a->x = 2;
137     a();
138     a(1);
139     a(1, 2);        //仿函数  就是用 对象(参数)     使用格式类似函数  所以叫做仿函数
140 
141     //A a(1, 2);//前面有类型   才是定义对象
142     //a(1, 2);//调用成员函数
143 
144     char str[128] = "hello world";    //存放字符串  使用堆内存
145 
146 
147     string st = "hello world";  //调用构造
148     if (st == "hello world")    //调用重载==
149     {
150         cout << "-----" << endl;
151 
152     }
153     st += "yes or no";        //重载+= 运算符
154     cout << st << endl;        //重载<<运算符
155 
156 
157     myString myst;
158     if (myst == "hello world")//等于运算符重载
159     {
160         cout << "重载运算符 修改函数" << endl;
161     }
162     myst = "hello world";
163     cout << myst << endl;
164 
165 
166 
167     cin.get();
168     return 0;
169 }
170 
171 //this  指向当前对象的指针
172 // *this  当前对象
173 
174 
175 //结构体  重载< 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!