天天看點

C/C++--two

面向對象

面向對象設計的三原則:封裝、繼承、多态。

(1)析構函數可以設定為virtual,為什麼?

  主要是因為多态的存在,例如一個父類指針指向一個子類對象,試想一下如果子類構造函數如果在堆中配置設定了記憶體,而析構其析構函數又不是virtual的,這個指針的靜态類型是父類類型,那麼撤銷這個父類指針時,将隻會調用父類的析構函數,而不會釋放子類占據的記憶體,造成記憶體洩漏。

将父類的析構函數設定為virtual型,則是以這個父類的派生類的析構函數都将自動變為virtual型。

(2)構造函數可以為virtual嗎?為什麼?

  虛函數的實作是依賴于虛函數表的,而虛函數表是在構造函數中進行初始化,在構造對象期間虛函數表還沒有被初始化,将無法進行。

(3)什麼是多态?

  多态性其實就是“一個接口,多種方法”,在程式運作的過程中才決定調用的函數。多态性是允許你将父對象設定成為和它的子對象相等的技術,指派後,父對象就可以根據目前指派給它的子對象的特性以不同的方式運作。是通過虛函數實作的。

  虛函數就是允許被其子類重新定義的成員函數。而子類重新定義父類虛函數的做法,叫做覆寫或者重寫。

那麼多态的作用是什麼?

  我們知道,封裝可以隐藏實作細節,使得代碼子產品話;繼承可以擴充已存在的代碼子產品;他們的目的都是為了代碼重用。而多态則是為了實作另一個目的—–接口重用。

(4)重載和覆寫有什麼不同?

  重載:在相同範圍内,函數名相同,函數參數清單不同(個數或類型),傳回值可相同可不同。

  覆寫:不在同一範圍(基類與派生類),函數名相同,參數相同,基類必須有virtual關鍵字。

(5)構造函數中能否抛出異常呢?析構函數中呢?

  構造函數中遇到異常是不會調用析構函數的,一個對象的構造函數未執行完畢,不能稱之為構造完成,構造要麼完全成功,要麼完全失敗。試想它都沒有構造成功,還不能算一個真正的對象,怎麼調用析構呢?對于成員變量,C++遵循這麼一個規律,會從異常的發生點按照成員變量的初始化的逆序釋放成員,也就是會調用已經初始化過的成員變量各自的析構函數。也就是說當我們用原始指針申請了一段空間,就會造成記憶體洩露,因為它們沒有自己的析構函數,必須程式員手動釋放。那怎麼辦呢?這時auto_ptr的作用就凸顯出來了,當使用的是auto_ptr進行動态記憶體管理時,系統就可以調用它的析構函數進行析構,就不會造成記憶體洩漏。

  對于析構函數來說,盡量不要在析構函數中抛出異常,因為析構函數用來釋放資源,試想當對象出現異常,有責任釋放這個對象的資源,調用對象的析構函數,可現在析構再出現異常,那麼就沒法保證這個對象的資源釋放完全了,而且這新出現的異常又由誰來處理呢?當然如果非得在析構函數中抛出異常,那就必須在析構函數中捕捉它。

  是以析構函數中盡可能不要抛出異常。如果非抛不可,那麼就自己的異常,自己處理。

(6)講講三種內建繼承。

  繼承是實作代碼重用的最重要的手段,繼承可以擴充已存在的代碼子產品。

  繼承體系中的作用域:

  • 在繼承體系中基類和派生類是兩個不同作用域。
  • 子類和父類中有同名成員,子類成員将屏蔽父類對成員 的直接通路。(在子類成員函數中,可以使用基類: : 基類成員)通路–隐藏–重定義
  • 注意在實際中在繼承體系裡面最好不要定義同名 的成員
    C/C++--two

(7)什麼是虛繼承?他與一般繼承有什麼不同?它有什麼用?

  虛拟內建是多重繼承中特有的概念。虛拟繼承是為了解決菱形繼承的二義性和資料備援的問題。

位運算與嵌入式程式設計

(1)關鍵字volatile有什麼含義?并給出三個不同的例子。

  變量定義為volatile是說這變量可能會被意想不到地改變,這樣編譯器就不會去假設這個變量的值了。簡單來說就是優化器在用到這個變量時必須每次都小心的重新讀取這個變量的值,而不是使用儲存在寄存器裡的備份。下面是幾個例子:

  • 并行裝置的硬體寄存器
  • 一個中斷服務子程式會通路到的非自動變量
  • 多線程應用中被幾個任務共享的變量

(2)了解Little-endian和Big-endian?

  小端模式:CPU對操作數的存放方式是從低位元組到高位元組。

  大端模式:存放方式是從高位元組到低位元組。

(3)關鍵字static的作用是什麼?

  • 函數體内static變量的作用範圍為該函數體,不同與auto變量,該變量的記憶體隻被配置設定一次,是以其值在下次調用時仍維持上次的值。
  • 在子產品内的static全局變量可以被子產品内的所有函數通路,但不能被子產品外其他函數通路。
  • 在子產品内的static函數,隻能被子產品内的其他函數調用。
  • 在類中的static成員變量屬于整個類所擁有,對類的所有對象隻有一份拷貝。
  • 在類中的static成員函數資料整個類所擁有,這個函數不接受this指針,因而隻能通路類的static成員變量。