天天看點

寫出高品質的代碼——“零星”總結(延續3)

特别是在C++如何使用C

C++中使用C的程式庫,實作C++和C的混合程式設計:extern "C" { /* code */ }一定要加在C++的代碼檔案裡才幹起作用。

//C編譯器編譯函數時不帶函數的類型資訊,僅僅包括函數符号名字。而C++編譯器為了實作函數重載,在編譯時會帶上函數的類型資訊。extern "C"的作用:告訴C++連結器尋找調用函數的符号時,採用C的方式。

===================================

使用memcpy()系列函數時要足夠小心【memcpy()、memset()、memcmp()】

在C語言中,不管是内置類型,還是自己定義的結構類型(struct),其記憶體模型都是可知的。透明的,故能夠對該對象的底層位元組序列一一進行操作。

在C++中,把C 中的資料類型叫做POD(Plain Old Data)對象(C的全部對象都是POD)。

POD對象特性:二進制内容是能夠任意複制的。

C++标準并未對非POD對象的記憶體布局做不論什麼定義。對于不同的編譯器。其對象布局是不同的。而在C語言中,對象布局隻會受究竟層硬體系統差異的影響。

盡量用new/delete 取代malloc/free

malloc與new之間的主要差别:

1)new 是C++ 運算符,而malloc 則是C标準庫函數。

2)通過new建立的東西是具有類型的,而malloc函數傳回的則是void*,須要進行強制轉型。

3)new 能夠自己主動調用的構造函數。而malloc不會。

4)new 失敗時會調用 new_handler 處理函數。而malloc失敗則之間傳回 NULL。

------------------------------------

free與delete之間的僅僅有兩點差别:

1)delete 是C++運算符,free 是C标準庫函數。

2)delete 能夠自己主動調用對象的析構函數,而malloc 不會。

針對内置函數。沒有對象的構造與析構,故malloc/free 除了須要強制轉型之外。和new/delete無異。

realloc(C中又一次設定記憶體塊的大小):C++中僅僅能先釋放原來的記憶體,再又一次申請。

盡量使用C++标準的 iostream

1)prinf缺點:《​​盡量不要使用可變參數​​》。而C++ iostream 類型安全。可擴充性強。

2)C中的stream長處:

a.一般覺得C stream函數生成的可運作檔案更小,效率更高。

b.C++ stream 程式庫中的類會涉及對象構造、析構的問題。而 C stream 函數沒有。

c.C stream 函數有更強的可移植能力。

盡量採用C++風格的強制類型轉型

連結:​​reintepret_cast、static_cast、dynamic_cast、const_cast​​

C++強制轉型更安全、轉型針對性更強。

盡量用const、enum、inline替換#define<盡量把工作交給編譯器而非預處理器>

#define PI 3.1415926       //#define不屬于語言自身範疇、PI符号名不會被編譯器列入符号表

const double PI  = 3.1415926;//常量屬于語言層面、PI會進入符号表、常量能夠避免目标碼的多份複制,即生成的目标代碼更小。由于預處理器會替換目标代碼中全部宏PI,而常量僅僅會配置設定一塊記憶體

-----------------------------------

定義常量的資料成員的主要目的是為了将常量的作用域限制在一個特定的類裡,為了讓限制常量最多僅僅有一份,還必須将該常量用static進行修飾:

static const int NUM_LESSONS = 5;//聲明唯一常量(類内初始化)(一般形式的初始化不同意放在聲明裡,需将其初始化放到實作檔案中,該變量的定義處:const double CMath::PI = 3.1415926;/*

實作檔案.cpp */)

早期的編譯器可能不接受在聲明一個靜态的類成員時為其賦初值。

假設編譯器不支援類内初始化,而此時編譯器又恰恰須要定義的成員常量值,借助enum 解決。枚舉類型能夠冒充整數給程式使用。

class CStudent{

private:

  enum{ NUM_LESSONS = 5 };

  int scores[ NUM_LESSONS];  }; 

類内部的靜态常量絕對不能使用#define來建立,#define的世界中沒有域的概念,即沒有不論什麼封裝效果。

C++的inline内聯函數:對于形似函數的宏,盡量使用内聯函數,既能夠得到宏的高效,又能夠保證類型的安全。

用引用取代指針

引用僅僅是其相應實體的别名,能對引用做的唯一操作是将其初始化(必須在定義時就初始化)。

一旦初始化結束,引用就是其相應實體的還有一種叫法了。

不占用不論什麼存儲空間,因為沒有位址,是以不存在引用的引用、指向應用的指針或引用的陣列等的定義。

繼續閱讀