劍指offer(1)賦值運算符

定義賦值運算符的注意事項:

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;
 }

如果想看完整的運行代碼請看下面的鏈接

點擊打開鏈接

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