關於深拷貝和淺拷貝

深拷貝和淺拷貝的認識:
淺拷貝:就是被拷貝對象和拷貝對象公用同一塊空間,即兩個對象的指針指向同一塊空間。
深拷貝:就是被拷貝對象和拷貝對象有各自的空間,拷貝對象將新開闢一塊空間,再將被拷貝對象拷貝下來。


下面是關於深拷貝和淺拷貝的實現
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;

};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章