在C++ string类是比较典型的一个类。在类的内部使用一个char类型的指针去维护一个内存。最主要的成员函数包括构造函数、析构函数、拷贝构造函数,拷贝赋值函数。 下面就使用 C++实现String类
#include <iostream> #include <cstring> using namespace std; class String{ public: //构造函数 String(const char* str = NULL){ //动态分配内存 m_str = new char[strlen(str?str:"") + 1]; //完成字符串的拷贝 strcpy(m_str,str?str:""); } //析构函数 ~String(void){ delete[] m_str; m_str = NULL; } //拷贝构造函数 String(const String& that){ //编译器默认的拷贝构造函数是完成对成员指针的复制,并没有复制指针所指向的内容。这样在析构的时候会有double free 的异常。这就是浅拷贝。 //分配一块能够接收要拷贝的字符串 m_str = new char[strlen(that.m_str) + 1]; //拷贝数据 strcpy(m_str,that.m_str); } //拷贝赋值 //String s0 = "zifu" //String s; s = s0;==>拷贝赋值 //String s1 = s0==>拷贝构造 String s1(s0) String& operator=(const String& that){ if(&that != this){ //在拷贝赋值定义对象时,已经分配了内存 现在要将分配的内存释放掉,然后重新分配内存 delete[] m_str; m_str = new char[strlen(that.m_str) + 1]; //拷贝数据 strcpy(m_str,that.m_str); } return *this;//返回调用对象自身 } //重载输出操作符 << friend ostream& operator<<(ostream& os,const String& str){ os << str.m_str; return os; } private: char* m_str; }; int main(void){ //空字符串 String s; cout << s << endl; String s1 = "C++"; cout << s1 << endl; //拷贝构造 String s2(s1); cout << s2 << endl; //拷贝赋值 String s3; s3 = s1; cout << s3 << endl; return 0; }