自己实现一个String类(C++)
C++默认的拷贝构造函数和赋值构造函数都是浅拷贝,所以当遇到成员含有指针变量时,需要自己实现深拷贝。
写个简单的String就是很好的例子。
#include<bits/stdc++.h> using namespace std; class String{ public: // 默认构造函数 String(const char* str = nullptr); // 拷贝构造函数 String(const String& str); // 析构函数 ~String(); // 字符串赋值函数 String& operator= (const String& str); char* getStr() { return this->data; } private: char* data; int size; } ; // 构造函数 String::String(const char* str) { if(str == nullptr) // 加分点 { data = new char[1]; data[0] = '\0'; size = 0; } else { size = sizeof(str); data = new char[size+1]; strcpy(data, str); } } // 拷贝构造函数 String::String(const String& str) { size = str.size; data = new char[size+1]; strcpy(data, str.data); } // 析构函数 String::~String() { delete[] data; } String& String::operator=(const String& str) { if(this == &str) return *this; // 得分点:检查自赋值 delete[] data; // 得分点:释放原有空间 size = str.size; data = new char[size+1]; strcpy(data, str.data); return *this; } int main() { char* s = "hello"; String* testStr = new String("12345"); String* testStr2 = new String(s); String testStr3(*testStr2); String testStr4 = testStr3; String testStr5 = std::move(testStr4); // move()可以将值转化成右值 cout << testStr->getStr() << endl; cout << testStr2->getStr() << endl; cout << testStr3.getStr() << endl; cout << testStr4.getStr() << endl; cout << testStr5.getStr() << endl; }
个性签名:时间会解决一切