1:返回值的類型聲明爲該類型的引用,並在函數結束前返回實例自身的引用(*this),只有返回一個引用,才能連續賦值。
2:傳入的參數類型聲明爲常量引用。如果傳入的參數不是引用而是實例,那麼從形參到實參會調用一次賦值構造函數。把參數聲明爲引用會避免這種情況,提高效率。同時,賦值運算符函數內不會改變傳入實例的狀態,因此應該對傳入的引用參數加上const.
3:分配新內存之前需先釋放自身已有的空間,避免內存泄露。
4:判斷傳入的參數和當前的實例(*this)是不是同一個實例,是的話不進行賦值,直接返回。否則爲同一個實例時,一旦釋放了自身的內存(注意點3),傳入的參數的內存也會被釋放掉,就會找不到需要賦值的內容。
代碼來自劍指offer:
爲下面的類建立賦值運算符函數
class CMyString
{
public:
CMyString(char *pData=NULL);構造函數
CMyString(const CMyString &str);拷貝構造函數
~CMyString(void);析構函數
private:
char *m_pData;
}:
賦值運算符函數
CMyString& CMyString::operator=(const CMyString &str)//注意點1和2
{
if(this==&str)//注意點4
return *this;
delete []m_pData;//注意點3
m_pData=NULL;
m_pDate=new char[strlen(str.m_pData)+1];
strcpy(m_pData,str.m_pData);
return *this;
}
如果想看完整的運行代碼請看下面的鏈接