1. 程式人生 > >C++常見筆試面試題目:string類的拷貝賦值運算子函式

C++常見筆試面試題目:string類的拷貝賦值運算子函式

要求:寫出一個String類的賦值運算子函式
注意事項:
(1)返回值的型別需宣告為該型別的引用,並在函式結束前返回例項自身的引用(即*this),因為只有返回一個引用,才可以允許連續賦值。
(2)傳入引數必須為常量的引用。常量確保在函式內不改變傳入例項的狀態,而引用避免呼叫複製建構函式,以提高程式碼的效率。
(3)判斷傳入的引數和當前例項是否是同一個例項,以免在此時出現刪除自身記憶體的情況。
(4)釋放例項自身已有的記憶體,避免出現記憶體洩露。
程式碼如下:

String& String::operator=(const String &another)//注意返回型別寫在前面
{ if(&another==this) { return *this; } delete [] m_data; m_data=NULL; m_data=new char[strlen(another.m_data)+1]; strcpy(m_data,another.m_data); return *this; }

另有考慮異常安全性的程式寫法,該寫法可以避免以下情況:在分配記憶體之前先delete了例項m_data的記憶體,而後續new char分配記憶體時記憶體不足,丟擲異常,而此時m_data將是一個空指標,在後續使用中容易導致程式崩潰。
程式碼如下:

String& String::operator=(const String &another)
{
    if(&another!=this)
    {
        String strTmp(another);
        char *tmp=strTmp.m_data;
        StrTmp.m_data=m_data;
        m_data=tmp;
    }
    return *this;
}

補充:在筆試面試過程中,也經常考察對整個string類的編寫,主要包括建構函式,解構函式,拷貝建構函式,拷貝賦值運算子等,需理解牢記。
程式碼如下:

class String
{
public:
    String (const char* str=NULL);//普通建構函式
    String(const String &another);//拷貝建構函式  注意形參要是常量引用型別
    ~String();//解構函式
    String & operator=(const String &another);//拷貝賦值操作符  形參要是常量引用型別,返回引用型別
private:
    char *m_data;
};
String::String(const char*str)
{
    if(NULL==str)
    {
        m_data=new char;
        m_data='\0';//此處注意
    }
    else
    {
        m_data=new char[strlen(str)+1];
        strcpy(m_data,str);
    }
}
String::~String()
{
    delete [] m_data;
    m_data=NULL;
}
String::String (const String &another)
{
    m_data=new char[strlen(another.m_data)+1];
    strcpy(m_data,another.m_data);
}
String& String::operator=(const String &another)//注意返回型別寫在前面
{
    if(&another==this)
    {
        return *this;
    }
    delete [] m_data;
    m_data=NULL;
    m_data=new char[strlen(another.m_data)+1];
    strcpy(m_data,another.m_data);
    return *this;
}