- 深拷贝实现string类
#define _CRT_SECURE_NO_WARNING 1 #include<iostream> #include<string> using namespace std; class String { public: friend ostream&operator << (ostream &os, String &str); friend String operator+(const String &str1, const String &str2); //双目运算符重载为友元函数 String() //默认构造函数 :_size(0) { _str = new char[1]; *_str = ‘\0‘; } char *my_strcpy(char *dest, const char *src) { char *tmp = dest; while (*src) { *dest = *src; dest++; src++; } *dest = ‘\0‘; return tmp; } int my_strlen(const char *str1) { int count = 0; while (*str1) { count++; str1++; } return count; } String(char *str="") //构造函数 :_str(new char[my_strlen(str) + 1]) , _size(my_strlen(str)) { my_strcpy(_str, str); } ~String() //析构函数 { delete[] _str; } String(const String &str) //拷贝构造 { _size = str._size; _str = new char[my_strlen(str._str) + 1]; my_strcpy(_str, str._str); } String &operator=(String &str) //赋值 { if (this != &str) { if (_size < str._size) { delete[] _str; _str = new char[my_strlen(str._str) + 1]; } _size = str._size; my_strcpy(_str, str._str); } return *this; } int my_strcmp(const char *str1, const char *str2) { while (*str1 == *str2) { if (*str1 == ‘\0‘) { return false; } str1++; str2++; } return *str1 - *str2; } //比较操作符 bool operator==(const String &str) { if (my_strcmp(_str, str._str) == 1) { return true; } return false; } bool operator!=(const String &str) { return !(_str == str._str); } bool operator>(const String &str) { if (my_strcmp(_str, str._str) > 0) { return true; } return false; } bool operator<(const String &str) { if (my_strcmp(_str, str._str) <0) { return true; } return false; } bool operator>=(const String &str) { return ((_str>str._str) || (_str == str._str)); } bool operator<=(const String &str) { return ((_str < str._str) || (_str == str._str)); } char & operator[](int index) //下标操作符 { if (index >= 0 && index < _size) return _str[index]; } String insert(int pos, char ch) //在pos后插入字符 { char *_old = _str; _size = _size + 1; _str = new char[_size + 1]; for (int i = 0; i < pos; i++) { *(_str + i) = *(_old + i); } for (int i = pos; i < pos + 1; i++) { *(_str+i) = ch; } for (int i = pos + 1; i < _size; i++) { *(_str + i) = *(_old + i - 1); } *(_str + _size) = ‘\0‘; delete _old; return *this; } private: char *_str; int _size; }; String operator+(const String &str1,const String &str2) { String tmp(""); tmp._size = str1._size + str2._size; tmp._str = new char[tmp._size + 1]; strcpy(tmp._str, str1._str); strcat(tmp._str, str2._str); return tmp; } ostream& operator << (ostream &os, String &str) { os << str._str << endl; return os; } int main() { String str1(""); String str2("abc"); String str3(str2); String str4("a.b.c."); String str5(""); str1=str4; str3.insert(2, ‘a‘); str5 = str2 + str3; cout << str1 << endl; cout << str2 << endl; cout << str3 << endl; cout << str4 << endl; cout << str5 << endl; system("pause"); return 0; }
浅拷贝实现string类中的简单几个
#include<iostream> using namespace std; class String { public: friend ostream& operator << (ostream &os, String &str); char* my_strcpy(char *dest, char *src) { char *tmp = dest; while (*src!=‘\0‘) { *dest++ = *src++; } *dest = ‘\0‘; return tmp; } String(char *str = "") //构造函数 :_str(new char[strlen(str)+5]) { *(int *)_str = 1; //计数器 _str += 4; my_strcpy(_str, str); } ~String() //析构 { if (_str != NULL) { if (--(*(int *)(_str-4))==0) { delete[] (_str-4); } } } String(String const &str) { _str = str._str; ++(*(int *)(_str-4)); } String operator=(const String &str) { if (this != &str) //自赋值 { if (--(*(int *)(_str - 4)) == 0) { delete[](_str - 4); } _str = str._str; ++(*(int *)(_str - 4)); } return *this; } char &operator[](int n) { return _str[n]; } private: char *_str; }; ostream& operator << (ostream &os, String &str) { os << str._str << endl; return os; } int main() { String str1("what "); String str2(str1); cout << str2[2] << endl; String str3 = str1; cout << str1 << endl; cout << str2 << endl; cout << str3 << endl; system("pause"); return 0; }
时间: 2024-10-02 21:10:43