C++ Primer Plus(九)——內存模型和名稱空間

  1.  程序分紅三部分:程序員

    1. 頭文件:包含結構聲明和使用這些結構的函數的原型,使用#define或const定義的符號常量,類聲明,模板聲明,內聯函數數組

      只需將源代碼文件加入項目中,而不用加入頭文件;不要使用#include來包含源代碼文件,這樣將致使多重聲明。函數

      同一個文件中只能將同一個頭文件包含一次,可使用如下的防禦方案。基於預處理器編譯命令#ifndef,能夠在沒有使用#define定義某個特定名稱時,處理#ifndef和#endif之間的語句。但這種方法並不能防止編譯器將文件包含兩次,而只是讓他忽略除第一次外的全部內容。spa

    2. 源代碼文件:包含與結構相關的函數的代碼操作系統

    3. 源代碼文件:包含調用與結構相關的函數的代碼線程

  2. C++標準容許每一個編譯器以他認爲合適的方式實現名稱修飾,所以不一樣編譯器建立的對象代碼文件極可能沒法正確的鏈接。請確保全部對象文件都是由同一個編譯器生成的。對象

  3. C++的存儲連續性:自動存儲連續性、靜態存儲連續性、線程存儲連續性、動態存儲連續性內存

  4. 在C++11中,關鍵字auto用於自動類型判斷,但在C語言和之前的C++版本中,auto的含義大相徑庭,它被用於顯式指出變量爲自動存儲。在C++11中,這種用法再也不合法。作用域

  5. 在C++11前,關鍵字register用於建議編譯器使用CPU寄存器來存儲自動變量。在C++11中,關鍵字register這種提示做用失去,只用於顯式指出變量是自動的。開發

  6. 5種變量的儲存方式

    存儲描述 持續性 做用域 連接性 如何聲明
    自動 自動 代碼塊 在代碼塊中
    寄存器 自動 代碼塊 在代碼塊中,使用關鍵字register
    靜態,無連接性 靜態 代碼塊 在代碼塊中,使用關鍵字static
    靜態,內部連接性 靜態 文件 內部 不在任何函數內,使用關鍵字sattic
    靜態,外部連接性 靜態 文件 外部 不在任何函數內
  7. 若是在多個文件中使用外部變量,只需在一個文件中包含該變量的定義,但在使用該變量的其它全部文件中,都必須使用關鍵字extern聲明它。

  8. 在默認狀況下全局變量的連接性爲外部的,但const所有變量的連接性爲內部的。若是但願某個常量的連接性爲外部的,則可使用extern關鍵字來覆蓋默認的內部連接性。

  9. 可使用static關鍵字將函數的連接性設置爲內部的,即只能在一個文件內使用,但必須同時在原型和函數定義中使用該關鍵字。

  10. 內聯函數不受單定義規則的約束,但要求同一個函數的全部內聯定義都必須相同。

  11. 若是要在C++程序中使用C庫中編譯的函數能夠用函數原型來指定要使用的約定:

    1. extern 'C' 函數定義:使用C語言連接性

    2. extern 函數定義:使用默認方式——C++

    3. extern 'C++' 函數定義:使用C++語言連接性

  12. 在程序結束時,由new分配的內存一般都會被釋放,但在一些不健壯的操做系統中,可能不會被釋放,最佳的作法是使用delete來釋放new分配的內存。

  13. 若是要爲內置的標量的類型、有合適構造函數的類分配空間並初始化,可在類型後面加上初始值,並用括號括起。在C++11中,要初始化常規結構或數組,須要使用大括號的列表初始化。

  14. 定位new運算符訥訥夠讓程序員指定要使用的位置,程序員可能使用這種特性來設置七內存管理規程、處理須要經過特定地址進行訪問的硬件或在特定位置建立對象。

  15. 名稱空間能夠是全局的,也能夠位於另外一個名稱空間中,但不能位於代碼塊中。

  16. using聲明使一個名稱可用,而using編譯命令使全部的名稱可用。

  17. 若是使用using編譯指令將該名稱空間的名稱導入該聲明區域,則局部的版本將隱藏名稱空間版本。

  18. using編譯指令是可傳遞的,若是A op B 且 B op C,則A op C,則說操做op是可傳遞的。

  19. 能夠給名稱空間建立別名:namespace xxx=另外一個名稱空間。

  20. 省略了名稱空間的名稱來建立未命名的名稱空間,則提供了連接性爲內部的靜態變量的替代品。

  21. 名稱空間的指導原則:

    1. 使用已命名的名稱空間聲明的變量,而不是使用外部全局變量或靜態全局變量。

    2. 若是開發了一個函數庫或類庫,將其放在一個名稱空間中。

    3. 僅將編譯指令using做爲一種將就代碼轉換爲使用名稱空間的權宜之計。

    4. 不要在頭文件中使用using編譯指令,若是非要使用,應將其放在全部預處理編譯指令#include後

    5. 導入名稱時,首先選用做用域解析符或using聲明的方法。

    6. 對於using聲明,首選將其做用域設置爲局部,而不是全局。

相關文章
相關標籤/搜索