C++常見筆試面試題目:string類的拷貝賦值運算子函式
阿新 • • 發佈:2019-02-03
要求:寫出一個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;
}