C++ 之 class 的思考
工作多年,突然發現c++這么多年都是零散記錄了些自己對C++的反思,沒有做過任何的文字記錄表示遺憾。
看到很多小伙也都在寫技術博客,那我自己也就寫一寫自己的一些 思考吧!
C++的基本類這個東西,想必每個學過計算機語言的同學對這個class多有自己的理解。
C++中的類其高深莫測的內部細節,與其他語言不大相同,最為C++er 應該清晰地了解一個類的內部構造以及編譯器為你做了什么,
這樣才能省去很多未知的坑!!
對于一個class來說,編譯器一般都會為你自動編寫了 默認構造函數、拷貝構造函數、重載賦值符、析構函數。當然,如果你自己聲明并實現了如上對應的函數,
編譯器將不再為你提供相應的函數。 這里強調一點默認的拷貝構造函數與賦值符 內部是淺拷貝形式,如果在class內部有存在指針類型的成員變量,你就應該重載
相應的賦值符與拷貝構造函數。
注意1:重載=號時,返回的引用 應該是*this!!
注意1:拷貝構造與賦值符 也應該 對其所繼承父類進行構造或者賦值!!!!
c++ 有了類的概念,而且作為一個面向對象語言,就應該有封裝、繼承、多態 這三個面向對象語言的特性。
一、class和struct在c++中基本沒有太大區別,它倆為c++提供封裝特性,class與struct的區別在于,class默認為private,而struct默認為public。
二、c++的繼承有些復雜,它支持多繼承!導致臭名昭著的菱形繼承的問題,當然也有解決方案,此問題后期再做討論!
三、C++的多態,基于繼承, 父類調用相應的函數展現出不同形態就為多態。C++的多態解決了C++沒有接口關鍵字或者接口這個東西!
注意,如果要用多態這個特性,請你記住基類的析構函數必須是virtual!! 因為指向子類的父類指針,在析構的時候如果父類的析構函數不是virtual類型,則不會調用到
子類的析構函數,可能造成資源泄露! 相反:如果這個類不是用作基類或者多態來用,不應該聲明virtual 析構!!!!
同理 你如果要使用多臺這個特性,virtual的虛成員函數,可以構建一個虛函數表讓父類調用函數時明確調用的具體函數!當然一個class的虛函數表是在整個類的最前端!
說到virtual 還有一個重要的情況需要記錄在案!那就是最好不要在析構和構造中調用 virtual函數,因為,父類和子類的構造析構順序的原因,子類在構造或析構期間,
有可能之調用的是父類函數,或者父類已經析構,都會造成未知的錯誤!!!
浙公網安備 33010602011771號