溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

簡單實現string類

發(fā)布時間:2020-10-10 10:50:05 來源:網絡 閱讀:189 作者:mumu462 欄目:編程語言


簡單實現string類,正確管理資源。

1、首先定義它的成員變量:

private:
    char* _data;//定義一個字符指針

2、實現它的構造函數:

String(const char* str="") //如果定義對象時沒有傳參數,使用缺省構造參數構造出""字符串
    :_data(new char[strlen(str)+1])    //+1表示多創(chuàng)建一個空間存'\0'
{
    strcpy(_data,str);
}

3、實現拷貝構造

如果我們在實現拷貝構造時(賦值運算符重載類似),進行簡單賦值的淺拷貝

String(const String& s)
         : _data(s._data)
    {}

當類里面有指針對象時,進行簡單賦值的淺拷貝,兩個對象指向同一塊內存,析構時delete兩次一個內存塊,會崩潰。所以必須進行深拷貝

String(const String& s)
    :_data(new char[strlen(s)+1])
{
    strcpy(_data,s._data);
}

現代寫法

//利用構造函數,傳入s._data創(chuàng)建對象tmp,然后交換_data,tmp._data。此時_data指向根據構造函數new出來的新數據,即_data指向tmp._data,而tmp._data指向NULL。出了函數作用域后,自動調用tmp的析構。這種寫法可以只用在構造和析構里,開辟空間或釋放空間。

String(const String& s)
    :_data(NULL)
{
    String tmp(s._data);
    swap(_data,tmp._data);
}

4、實現賦值運算符重載

String& operator=(const String& s)
{
    if(this!=&s)
    {
        delete []_data;//如果此時的對象是缺省參數構造的,也會開辟空間存'\0',所以都得delete
       _data=new char[strlen(s._data)+1];
        strcpy(_data,s._data);
    }
    return *this;
}

現代寫法

//String s此時參數沒有傳&,實參傳進來時,會調用拷貝構造函數 s(實參),swap后_data指向s._data,而s出作用域后被析構
String& operator=(String s)           
{
	swap(_data,s._data);
	return *this;
}

如果此時對象S=S,那么會多開辟一塊空間,來保存相同的字符串,這樣會浪費空間,改進后的代碼:

String& operator=(const String& s)
{
    if (this != &s)
    {
        String tmp(s._data);
        swap(tmp._data);
    }
	return *this;
}

5.析構

~String()
{
    if(_data)
    {
        delete[] _data;
        _data=NULL;
    }
}





向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI