極客班-C++面向對象高級編程(上)-第二周筆記

class的三大函數是
1.拷貝構造。
2.拷貝賦值。
3.析構。

其他備忘:
1. 構造函數函數分兩類:拷貝構造和默認構造。
2. strlen計算長度時,不包含末尾的 '\0'。
例如如下字符串類String的拷貝構造函數:
String::String(const String& str) { m_data = new char[strlen(str.m_data) + 1]; strcpy(m_data,str.m_data); }
此處若不做 strlen(...) + 1,會造成新的m_data字符串沒有結束符的問題。(而且貌似strcpy也會出錯。)
3. 構造函數放在private里面時,對象將不能直接構造。
4. 對于有指針成員的類,注意要自己實現三大函數。使用默認生成的函數會造成不良后果:
(1)使用默認的拷貝構造和拷貝賦值,會造成新生成的對象內部指針指向來源對象的動態分配空間,造成動態分配空間的共享。這會造成不可預計的嚴重錯誤。(比如1,其中一個對象更改了“動態空間”,另一個對象的所謂的“動態空間”也被一起改動了。比如2,其中的一個對象銷毀了空間釋放了,此時一個對象的“動態空間”,可能又會分配給其他對象,讀出的數據可能被其他對象更改,或者自己寫入數據又更改了其他對象的數據。等等)
(2)使用默認的析構函數,則會造成動態生成的空間沒有被釋放,造成內存泄漏的問題。
5. 拷貝復制函數注意添加入口判斷。
例如字符串類String的拷貝復制函數:
String& String::operator= (const String& str) { if(this == &str) { return *this; } delete[] m_data; m_data = new char[strlen(str.m_data) + 1]; strcpy(m_data,str.m_data); return *this; }
此處若不做錯誤處理,會因為后面的delelte[] m_data;操作而把自己的數據刪除,造成數據丟失,以及后面strlen、strcpy執行出錯的問題。
6. 拷貝復制函數編寫時要考慮 s3 = s2 = s1這種連續拷貝復制的情況。
例如字符串類String的拷貝復制函數:
String& String::operator= (const String& str) { ...... return *this; }
此處要在代碼末尾添加return *this,返回類型寫成自己類的引用。
7. 堆空間和棧空間的比較:
(1)堆空間比棧空間大很多,因此如果要創建很大的臨時空間,使用堆空間比較不容易達到空間上限。
(2)棧空間創建和銷毀由程序自己完成。堆空間創建和銷毀要由代碼明確創建和銷毀,不然會造成內存泄漏問題。
(3)如果創建的數組變量大小不確定,那么使用堆空間來動態創建會比較不浪費空間。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容