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