編寫類String的構造函數、拷貝構造函數、析構函數和賦值函數

1、題目:

class String
{
public:
    String(const char *str = NULL); // 普通構造函數    
    String(const String &other);    // 拷貝構造函數
    ~String(void);                    // 析構函數    
    String & operator = (const String &other);    // 賦值函數
private:
    char *m_data;                    // 用於保存字符串
};

各個解析:函數

一、構造函數                                               

/* this

   一、構造函數在構造對象時使用;
   二、傳入參數的判斷;
   三、對象的初始化問題。
*/spa

String::String(const char *str)
{
    if ( NULL == str)
    {
        m_data = new char[1]
        *m_data = '\0';
    }
    else
    {
        int len = strlen(str);
        m_data = new char[len + 1];
        strcpy(m_data,str);
    }
}

二、拷貝構造函數                                   

/*
   一、拷貝構造函數必須在構造對象時使用,即定義對象時;
   二、對象初始化問題。
*/code

String::String(const String &other)
{
    int len = strlen(other.m_data);
    m_data = new char[len+1];
    strcpy(m_data,other.m_data);
}

三、賦值函數                                       

/*
   一、賦值函數使用時,對象確定已經創建;
   二、賦值前,判斷是不是自我賦值;
   三、賦值前,內存空間的準備:
       因爲賦值前,對象已佔有必定大小內存,可是賦值對象所佔內存大小與
       對象已佔的內存大小不必定一致;
       先釋放對象已佔的內存,而後分配心內存。
   四、正常賦值
*/對象

String & String::operator = (const String &other)
{
    if (&other == this)
    {
        return *this;
    }
    
    delete [] m_data;
    int len = strlen(other.m_data);
    m_data = new char[len+1];
    strcpy(m_data,other.m_data);
    
    return *this;
}

四、析構函數                                        

/*
   資源的釋放
*/blog

String::~String(void)
{
    delete []m_data;
}

 五、拷貝構造函數與賦值函數相關知識             

  一、  拷貝構造函數與賦值函數的區別?

    在看到「=」操做符爲對象賦值的時候,內存

            若是是在對象定義時(Test B = (Test)c),此時調用拷貝構造函數;資源

            若是不是在對象定義賦值時(B = c),此時調用賦值函數。字符串

    注:構造函數、拷貝構造函數,帶有構造兩個字,顧名思義,就是在對象聲明或定義時纔會使用。class

  二、拷貝構造函數與賦值函數定義的區別?

    內存空間角度:

      1)拷貝構造函數的使用,是在創建對象時;當時對象沒有佔有內存,故不須要釋放內存,不從新創建內存空間。

      2)賦值函數的使用,是在對象創建後;當時對象已經佔有內存,故須要釋放先前內存,而後從新獲取內存空間。

相關文章
相關標籤/搜索