补充上一部分的运算符 这次写了这一些运算符 等于== 赋值= 箭头-> 括号运算符 () 输出运算符>>
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 //结构体 重载<