深拷貝和淺拷貝的認識: 淺拷貝:就是被拷貝對象和拷貝對象公用同一塊空間,即兩個對象的指針指向同一塊空間。 深拷貝:就是被拷貝對象和拷貝對象有各自的空間,拷貝對象將新開闢一塊空間,再將被拷貝對象拷貝下來。 下面是關於深拷貝和淺拷貝的實現 class String { public: //傳統寫法 String& operator=(const String& s) //運算符的重載 { if (this != &s) { /*delete[] _str; //先將_str釋放,然後開闢空間,再拷貝 _str = new char[strlen(s._str) + 1]; strcpy(_str, s._str);*/ char* tmp = new char[strlen(s._str) + 1]; strcpy(tmp, s._str); //先用臨時對象tmp開闢空間,在將字符串拷貝到 delete[] _str; tmp;然後釋放_str,最後在將tmp地址賦值給_str _str = tmp; } return *this; } String(char* str = "") //構造函數 :_str(new char[strlen(str) + 1]) { strcpy(_str, str); } String(const String& s) //拷貝構造函數 :_str(new char[strlen(s._str) + 1]) { strcpy(_str, s._str); } ~String() //析構函數 { if (_str) //如果_str不爲空,就用將_str釋放 { delete[] _str; } } //現代寫法 String(const String& s) //拷貝構造函數 :_str(NULL) { String tmp(s._str); //開闢臨時對象,在將字符串拷貝到臨時對象tmp swap(_str, tmp._str); //交換_str和tmp._str指針值,此時tmp指向NULL 而_str指向字符串 } String& operator=(const String& s) //運算符的重載 { if (&s != this) { String tmp(s._str); //方法同上 swap(_str, tmp._str); } return *this; } String& operator=(String s) //運算符的重載優化 { swap(_str, s._str); //對上面函數就行了優化,傳入對象過程中就進行了拷貝 所以直接交換指針值就可以了 return *this; } private: char * _str; };
關於深拷貝和淺拷貝
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.