我與C/C++之間的相愛相殺

2020-08-09 16:59:12

前沿: 

    到今天爲止,仔細算算我學習C和C++語言也有三年了。現在回想自己學習歷程,從迷茫到懵懂,再到熟練,其中痛並快樂着。想想自己掉入這坑就不想在爬起來了。就讓我繼續遨遊在知識的海洋中吧。今天我來淺析以下C和C語言。

 C與C++:

  •  C是程序導向的語言,C++是物件導向的語言。C++中有類和物件以及OPP思想必備的內容,而且C++支援模板、運算子過載、異常機制 機製處理以及強大的標準模板庫。
  •   C語言只能寫程序導向的程式碼,C++不僅能寫程序導向的程式碼,也可實現物件導向的程式碼;C++是物件導向的OPP語言,他還有強大的設計模式,比如單例模式、工廠模式等等,這些在C語言是不支援的。
  •  C和C++一個典型的區別就在動態管理上。C語言通過malloc和free進行堆記憶體的分配和釋放,C++是通過new和delete管理堆記憶體。new和malloc的區別參考部落格:https://blog.csdn.net/rjp_1987/article/details/104539467
  • 強制型別轉換也不一樣。C語言的強制型別轉換使用()裏面加型別進行強制轉換。C++有const_cast、static_cast、reinterpret_cast、dynamic_cast四種強轉模式。
  • 輸入和輸出方式不一樣。C++中還支援帶有預設值的參數、函數過載、行內函式。const在C語言和C++中區別也是不一樣的。在C++中struct不僅可以用來定義結構體,也可用來定義類。
  • C++不僅支援指針,還支援更安全的參照。在彙編程式碼上,指針和參照的操作是一樣的。由於C++是物件導向的語言,支援類物件、類和類之間的代理、繼承、多型等等物件導向設計,有很多設計模式可直接使用。所以在設計大型軟體時,通常會採用物件導向語言,這樣能更好的設計。

  struct和class

  •  struct 在C語言裏面是定義結構體,在C++中用struct定義的類。所以在C++中struct可以包含方法、能存取限定符、也可以實現繼承多型。在預設繼承時,基礎類別用struct或class定義,他們的繼承方式也不一樣,一個是public繼承,一個是private繼承。在定義參數列表時,class能用來定義模板型別參數,但struct不行。
  •   struct和class在C++中定義型別時,struct預設的存取限定符爲public,class預設的是private。
  •  C語言的空struct結構體和C++中的空Struct類或空class類,所佔記憶體大小不同。在C語言中爲0,C++中爲1(VS不允許C語言定義空struct,但GCC允許)。在C++中用類定義的是物件,是物件就需要呼叫建構函式,建構函式得現有記憶體(因爲建構函式有個形參this需要傳一個記憶體地址,沒有地址無法呼叫構造。),既然是一個空類,就給一個記憶體的最小定址單位(1位元組)。C語言中的結構體定義是變數,只需分配記憶體,沒有構造。
  •   struct變數或者物件可以以{}方式賦初始值,class不行.

  C++中強制轉換

   C++有const_cast、static_cast、reinterpret_cast、dynamic_cast四種強轉模式。

    1.static_cast

     static_cast是最常見的,用法爲 static_cast<type-id>(expression) 。

      把expression轉換成type-id型別,但執行時沒有安全檢查   保證轉換的安全性。

       主要用於基礎類別和子類之間指針或參照的轉換.由父類別指向子類存在安全隱患,子類指向父類別是安全的;用於基本數據型別轉         換,存在安全隱患;把空指針轉換爲目標型別指針;把任何型別轉換爲void型別。

  2.const_cast

     可以將const int *轉換爲int *,static_cast無法實現。用法:const_cast<type-id>(expression)

 3.reinterpret_cast 謹慎使用

     用法:reinterpret_cast<type-id>(expression)

     主要用於改變指針或參照型別;將指針或參照轉爲一個足夠長的整型;將整形轉換爲指針或參照型別。

     其中type-id必須是一個指針、參照、算數型別、函數指針或成員指針。可以把一個指針轉換爲一個整數,也可把一個整數轉     爲指針(把指針轉換爲整數,再把整數轉換爲原型別指針,還可得到原來指針值)。

4.dynamic_cast

   執行時處理,執行時需要進行安全檢查。其他三個是在編譯鏈接完成;

   不能用與內建的基本數據型別的強制轉換;

   要求<>內所描述的必須爲指針或參照。轉換成功返回指向類的指針或參照,失敗返回空指針;

   在進行基礎類別和派生類轉換時,由子類向父類別轉換時。與static_cast效果一樣;由父類別向子類轉換時。dynamic_cast具有安全檢查機制 機製,比static_cast更安全。向下轉換時是否成功還取決於轉換的型別,轉換的指針指向的物件的實際型別與轉換後的物件型別一定要一樣,尤其是涉及到類物件的指針或參照操作時,更容易錯誤。

  dynamic_cast進行轉換的基礎類別中一定要有虛擬函式,否則編譯不通過。類存在虛擬函式說明他想讓基礎類別指針或參照指向派生類,這是因爲執行時型別檢查需要執行時型別資訊,而這個資訊儲存在虛擬函式表中、