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