C++需要記住的一些點

  1. 常引用聲明方式: const int &ra = a;
  2. 在使用虛函數的類,析構函數也聲明成虛函數
  3. explicit的作用: 當一個類的構造函數像這樣時 A(int i), 可以 這樣構造一個對象A a; a = 10; 這一語句調用了默認的單參數構造函數,而explicit 則是用來禁止這種行爲的。
  4. 應該使用 extern”C” 來引用C代碼,因爲C沒有重載,可以只用函數名來標識一個函數,而C++則需要加上參數。
  5. 當類中含有const、reference 成員變量;基類的構造函數都需要初始化表。
    int &ref_; Test(int &val):ref_(val){}
  6. 針對類指針的問題,C++特別設計了更加細緻的轉換方法,分別有:
    static_cast (expression)
    dynamic_cast (expression)
    reinterpret_cast (expression)
    const_cast (expression)

    • static_cast強制轉換,但無關的轉換會報錯, 不能轉換掉expression的const、volatile、或者__unaligned屬性。

    • dynamic_cast 確保類指針的轉換是合適完整的,它有兩個重要的約束條件,其一是要求new_type爲指針或引用,其二是下行轉換時要求基類是多態的(基類中包含至少一個虛函數)。 dynamic_cast可以識別出不安全的下行轉換,但並不拋出異常,而是將轉換的結果設置成null(空指針)

    • reinterpret_cast用在任意指針(或引用)類型之間的轉換;以及指針與足夠大的整數類型之間的轉換;從整數類型(包括枚舉類型)到指針類型,無視大小。reinterpret_cast通常爲操作數的位模式提供較低層的重新解釋,比如將浮點數轉int, static_cast取整,reinterpret_cast則按內存數據組織成int

    • const_cast轉換符是用來移除變量的const或volatile限定符, const_cast可以將常量轉成非常量,但不會破壞原常量的const屬性,只是返回一個去掉const的變量。。 int* modifier = const_cast<int*>(const_p); const_cast就可以直接使用顯示轉換(int*)來代替。。但是絕對不對const數據進行重新賦值,即使改了,const也不會變。在什麼時候使用,可能調用了一個參數不是const的函數,而我們要傳進去的實際參數卻是const的,但是我們知道這個函數是不會對參數做修改的。於是我們就需要使用const_cast去除const限定,以便函數能夠接受這個實際參數。

  7. 類A 中沒有生命任何成員變量與成員函數,這時sizeof(A)的值是1, 那是被編譯器插進去的一個char ,使得這個class的不同實體(object)在內存中配置獨一無二的地址。 也就是說這個char是用來標識類的不同對象的.

  8. 當數組作爲函數的參數進行傳遞時,該數組自動退化爲同類型的指針。 sizeof得不到容量

  9. 用_onexit 註冊一個函數,它會在main 之後執行。
    (1)使用格式:_onexit(int fun()) ,其中函數fun()必須是帶有int類型返回值的無參數函數;
    (2)_onexit() 包含在頭文件cstdlib中,cstdlib爲c語言中的庫函數;

  10. T& 指向lvalue, const T&即可以指向lvalue也可以指向rvalue。

  11. 一個命名空間的各個組成部分可以分散在多個文件中, 可以嵌套(引用外層空間時,內層的也可用),using std::cout; 只引入cout

  12. 模板是泛型編程的基礎,泛型編程即以一種獨立於任何特定類型的方式編寫代碼。

  13. #define M(x) #x #運算符會把x轉換爲用引號引起來的字符串。
    #define M(a,b) a##b ## 運算符用於連接a和b。例子:

    
    #define concat(a, b) a##b
    
    int xy = 100;
    cout << concat(x, y);  //能替代變量xy
  14. 預定義宏

    • __LINE__ 這會在程序編譯時包含當前行號。
    • __FILE__ 這會在程序編譯時包含當前文件名。
    • __DATE__ 這會包含一個形式爲 month/day/year 的字符串,它表示把源文件轉換爲目標代碼的日期。
    • __TIME__ 這會包含一個形式爲 hour:minute:second 的字符串,它表示程序被編譯的時間。
    • Constant Explanation
    • SIGTERM termination request, sent to the program
    • SIGSEGV invalid memory access (segmentation fault)
    • SIGINT external interrupt, usually initiated by the user
    • SIGILL invalid program image, such as invalid instruction
    • SIGABRT abnormal termination condition, as is e.g. initiated by abort()
    • SIGFPE erroneous arithmetic operation such as divide by zero

    int raise (signal sig); 手動觸發信號
    void (*signal (int sig, void (*func)(int)))(int); 註冊信號

  15. POD stands for Plain Old Data - that is, a class without constructors, destructors and virtual members functions.

  16. 匿名namespace 是防止命名衝突,與加static的作用大致相同。但匿名namespace可以用於實例化模板。雖然在不同 translation unit都是匿名, 但其實是擁有獨特的命名的。

  17. tr1起源:C++03之後的版本計劃稱爲C++0x,又因爲計劃延遲,改稱爲C++11,C++0x有很新特性以標準庫的形式擴充,這些特性被詳細描述於一份稱爲TR1的文檔中,TR1代表“Technical Report 1”。TR1中的14個組件中有10個奠基於Boost,其中包括shared_ptr。TR1本身只是一份文檔,具體實現由編譯器完成。GCC於4.0版本中加入了TR1的實現,通過 #include <tr1/memory> 使用它,所有組件處於std::tr1命名空間下。在GCC4.3之後,在通過添加編譯選項-std=c++0x 並#include <memory> 後,可以在std::下找到shared_ptr。

  18. 使用shared_ptr管理數組時,需要定義其刪除器,因爲默認使用的是delete,而不是delete []。如果不需要共享管理對象,則使用unique_ptr更合適,因爲它對數組作了處理。http://stackoverflow.com/questions/13061979/shared-ptr-to-an-array-should-it-be-used

  19. 前置++比後置++效率高,因爲後置的需要返回一個臨時對象。 http://blog.csdn.net/weiwangchao_/article/details/4644597

  20. 當只需要知道某個class是一個class而不需要知道其定義時,比如,SomeClass *sc; 就可以使用前置聲明(forward declaratine),即class SomeClass;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章