1、C++指針和引用的區別
指針p:可以看做是一個對象,它有自己的地址(指針有自己在內存中的地址,所以有指向指針的指針),它內部可以存值(存的是指向的數據類型的值)。由于對象有常量和變量之分,所以指針也有常量和變量之分。常指針:所指向的變量地址是不可變的;指向常量的指針:指針所指向的數據類型是個常量,但是指針的指向是可以改變的。聲明一個指針之后不用立即初始化,指針可以指向NULL。
引用:引用不是一個對象,它沒有自己的地址,可以把引用看作是一個對象的別名。定義了一個對象之后,就必須初始化,不能指向NULL;并且一旦與一個值綁定之后,就不能再和其它值綁定在一起。
2、函數重載和函數重寫的區別
函數重載:當函數就有相同的函數名,但參數列表的情形不相同時(參數的個數不同或者參數的類型不同),這樣的同名不同參數的函數叫做函數重載。要注意的是:僅僅是返回值類型的不同,無法構成重載。它是C++多態性的一種體現。
函數重寫:也被成為函數覆蓋;是指子類重新定義虛基類(抽象類)中具有相同名稱和參數類型的虛函數或者成員函數,主要是在繼承關系中出現。(1)重寫的函數和被重寫的函數必須都為virtual函數,并分別位于基類和派生類中;(2)重寫的函數和被重寫的函數,函數名和函數參數必須完全一致;(3)重寫的函數和被重寫的函數,返回值相同,或者返回指針或引用,并且派生類虛函數返回的指針或引用的類型是基類中被替換的虛函數返回的指針或引用的類型的字類型。它也是C++多態性的一種體現。
3、對抽象類、virtual的使用和理解
抽象類,是指包含虛函數的類,它不能實例化對象,只能定義類的指針和引用,只能作為上層基類存在。用virtual聲明的虛函數有兩種:(1)普通虛函數(簡稱虛函數):有一個缺省實現;(2)純虛函數:只有一個定義,沒有具體實現。我對virtual的理解是:它是一種C++接口繼承的方式。C++的繼承方式有實現繼承和接口繼承;實現繼承就是,繼承父類中已經定義好的成員函數,通過創建子類的對象,傳入不同的值去調用,無需額外的編碼;另外一種是接口繼承:是指只繼承聲明,具體的實現要子類自己去完成;通過抽象類中的virtual可以達到接口繼承的效果。
4、說說面向對象的三個特征、以及你對它們的理解
(1)繼承:讓某個類型的對象獲得另一個類型的對象的屬性的方法;包括實現繼承和接口繼承;繼承的過程是從一般到特殊的過程。
(2)封裝:把客觀事物封裝成抽象的類,并且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。一個類就是一個封裝了數據以及操作這些數據的代碼的邏輯實體。通過封裝,可以對對象內部的數據設置不同級別的保護。
(3)多態:一個類的實例的方法在不同情形的使用下有不同的表現。多態機制使具有不同內部結構的對象可以共享相同的外部接口。這意味著,雖然針對不同對象的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以調用。’
5、抽象類與虛基類的區別
抽象類:包含有virtual虛函數的類
虛基類:虛繼承主要用于一個類繼承多個類的情況,避免重復繼承同一個類兩次或多次所產生的二義性問題。虛基類是相對于它的派生類而言的,它本身可以是一個普通的類。在直接派生類的繼承語句中用virtual關鍵字。例如 由類A派生類B和類C,類D又同時繼承類B和類C,這時候類D就要用虛繼承的方式避免重復繼承類A兩次。
6、對靜態數據和靜態方法的理解
靜態數據和靜態方法是對于類而言的,是類的所有實例對象所共享的數據和方法,直接通過類來進行調用。在內存中,靜態數據是不存在于類的實例對象中的,它不會重復產生,只在內存中保佑一塊一直存儲靜態值,可以將它看成是相對于這個類而言的全局方法或者全局變量。