簡介:本文章主要從物件導向程式設計的三大特點來敘述:封裝、繼承、多型;
1)struct 和 class 在c++中唯一的區別就是預設的訪問許可權不同,struct預設訪問許可權是public的,而class是private的;
2)乙個類中如果定義了全是預設引數的建構函式,那麼就不能再定義過載函式了。(二義性)
3)靜態成員靜態成員是類的成員,而不是某個物件的成員,類的靜態成員擁有一塊單獨的儲存區,不管建立了多少該類的物件,靜態成員都是唯一的乙個,共享的,這就為不同的物件提供了一種相互通訊的辦法(與不同程序間共享記憶體的程序通訊方式類似)。注意 :靜態成員的定義必須出現在類的外部且只能定義一次,所以在標頭檔案中定義靜態變數容易引起重複定義的錯誤;無論是基類還是派生類都可以改變靜態變數的值,說起來挺複雜,其實**表述簡單的多:
#include
using
namespace std;
class
base
;int base::var=10;
class
derived
:public base
;//派生類是空的,直接繼承
記憶體的占用:類的一般資料成員是不占用記憶體空間的,只有在定義物件時才會為物件的資料成員分配空間。但是類的靜態資料成員不屬於某乙個物件,在所有物件之外單獨開闢一段記憶體來存放。
靜態成員函式:與普通成員函式的根本區別是:非靜態成員函式有 this 指標,靜態成員函式沒有 this 指標。靜態成員函式一般是用來處理靜態資料成員的,因為靜態資料成員不屬於某乙個物件,所以不能用 this 指向靜態資料成員,只能用靜態成員函式來處理;
4)物件的儲存空間:乙個比較權威的定義:非靜態成員變數綜合加上編譯器為了cpu計算做出的資料對齊處理和支援虛函式所產生的負擔 的總和。
下面來看看資料成員、成員函式、建構函式、析構函式、虛函式的空間占用情況:
#include
using
namespace std;
class
cbox
;//空的
int main()
//執行結果是 1
空型別物件不包含任何資訊,大小應該為0,但是當宣告該型別的物件的時候,它必須在記憶體占用一定空間,否則無法生成物件,c++每個空型別的例項占用 1 byte;
class
cbox
;int
main()
//執行結果 12
三個int 型成員變數,3*4byte=12byte。
class
cbox
;int
main()
//執行結果 12
三個普通資料成員加乙個靜態成員,結果仍然是12,由此可見,靜態成員並不占用物件的記憶體,而是乙個單獨的記憶體;
class
cbox;~
cbox()
;};int
main()
//執行結果 1
三個函式,乙個析構函式,乙個建構函式,乙個普通函式,結果仍然是 1 ,說明函式是不占用物件空間的,所有物件共用乙個函式位址,函式單獨占用空間。
class
cbox;}
;int
main()
//執行結果 8
乙個虛函式,占用空間8,事實上,編譯器為了支援虛函式,會產生額外的負擔,這正是虛函式表的指標大小(
64位的機器中指標變數佔8byte),同樣,繼承虛基類也是一樣有虛表,虛指標。
析構函式與建構函式的執行順序
在同乙個環境下(比如都在區域性函式中),先建立的物件先構造,後建立的物件後構造,先構造的後析構,後構造的先析構
。如果在函式中定義的靜態區域性物件,則程式在第一次呼叫時構造,直到main函式退出或者呼叫exit函式結束程式時,才呼叫析構函式。
5)繼承
公用繼承:
基類的公用成員和保護成員在派生類中保持原有訪問的屬性,其私有成員仍為基類私有;
私有繼承:
基類的公用成員和保護成員在派生類中成了私有成員,其私有成員仍然為基類私有;
受保護的繼承:
基類的共用成員和保護塵緣在派生類中成了保護成員,其私有成員仍然為基類私有;
派生類的建構函式和析構函式:
派生類資料成員由:基類資料成員和派生類新增成員共同組成,派生類的資料成員中還有可能包含其他類的物件;因此構造派生類的物件時,必須對基類資料成員、新增資料成員和成員物件資料成員進行初始化。派生類建構函式的一般格式為:
派生類::派生類 (引數): 基類名1> (參數列1>), ..
.... ,基類名n> (參數列n>),
子物件名1>(參數列n+1>), ..
.... ,
子物件名m>(參數列n+m>)
注意點:1、對基類成員和子物件成員的初始化必須在成員初始化表中進行,新增成員的初始化既可以在成員初始化表中進行,也可以在建構函式體中進行。2、構造順序:先呼叫基類建構函式,再呼叫子物件建構函式,最後對派生類的建構函式體構造。
6)派生類的建構函式與析構函式的呼叫順序:
1 、 基類建構函式。如果有多個基類,則建構函式的呼叫順序是某類在類派生表中的出現順序,而不是他們在成員初始化表中的順序。
2 、 成員類物件建構函式。如果有多個成員類物件,構造順序是在類中被宣告的順序,而不是在初始化列表中的順序。
3 、 派生類建構函式
而析構函式與建構函式恰恰相反!
7)類的多型
虛函式配合類的繼承使用,實現多型;
虛函式:虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。
由於基類指標可以指向派生類中的基類部分,加上派生類重新定義的虛函式把基類的虛函式同名覆蓋了,實現了乙個型別的指標指向不同類的函式產生不同的響應,這就是多型。
第一行執行的是基類,第二行執行的是派生類,實現了多型。記住一點,虛函式的主要作用是在繼承的過程中可以同名覆蓋!
8)純虛函式
純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類必須要定義自己的實現方法。實現方法:在函式原型後加 「=0」,如下:
//虛函式的定義
virtual
void
fun();
//純虛函式的定義
virtual
void
fun()=
0;
含有純虛函式的類稱為抽象類,它不能生成物件。
9)析構函式和建構函式的虛構函式
首先,建構函式不能宣告為虛函式!析構函式一般宣告為虛函式;
建構函式:在編譯器構造物件時,必須知道物件的確切型別,才能正確的生成物件;其次,在建構函式執行之前,物件並不存在,無法使用指向此物件的指標來呼叫建構函式。
析構函式:當派生類物件經過乙個基類的指標被刪除了,這時候基類指標指向的只是派生類中的基類部分,同時析構函式也是執行的派生類中的基類部分,會導致派生類的新增資料部分沒有被銷毀,造成記憶體洩漏。
物件導向核心技術
只支援單繼承 即乙個子類只能繼承乙個父類 child extends parents重寫父類 重寫時不能降低方法的修飾許可權範圍,父類的protected可以改為public 但不能private parents a new child 父類宣告,子類實現 child a new parents 這...
java物件導向核心技術
1 內部類 內部類可以節省編譯後的位元組碼,class檔案的大小,而在實現監聽的時候,採用內部類很容易實現,但使用內部類會導致結構不清晰。1 成員變數內部類 public class out private int i 0 private void g private class inner voi...
後台開發 核心技術與應用實踐
常用類庫 在c 中,臨時物件都是const型別的。可以使用union 聯合 判斷系統是大端 big endian 還是little endian 小端 只能把列舉賦值列舉變數,不能把元素的數值直接賦值列舉變數。共用體以最長的位元組為準,考慮記憶體對齊。結構體以內建型別的最小公倍數對齊。編譯階段 g ...