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; }