C++ 容易犯的錯誤和容易忘記的知識點(一)

  1. 在使用printf輸出時,關於字符串輸出格式
    對於 %-a.bs:
    • 表示左對齊
      a 表示輸出佔的寬度,如果這個寬度不夠,則自動擴展到足夠寬度
      b 表示輸出字符串中多少個字符,如果原字符串長於這個寬度,則截斷,多餘的不輸出

2.關於指針數組和數組指針,比方說:
<1> int p1[10]; 和 <2> int (p2)[10];
分清楚的關鍵是依靠運算符優先級,[ ]優先級大於,所以p是一個數組,int 修飾的是數組的元素,所以<1>是在一個指針數組,每一個元素是一個指針
同理<2>是一個數組指針,是一個指向一個有十個元素的數組的指針。

3.關於內聯函數
<1>內聯函數中的代碼應該只是很簡單、執行很快的幾條語句。如果一個函數較爲複雜,它執行的時間可能上萬倍於函數調用的額外開銷,那麼將其作爲內聯函數處理的結果是付出讓代碼體積增加不少的代價,卻只使速度提高了萬分之一,這顯然是不划算的。

<2>有時函數看上去很簡單,例如只有一個包含一兩條語句的循環,但該循環的執行次數可能很多,要消耗大量時間,那麼這種情況也不適合將其實現爲內聯函數。

<3>需要注意的是,調用內聯函數的語句前必須已經出現內聯函數的定義(即整個函數體),而不能只出現內聯函數的聲明。

4.關於靜態成員變量
<1> 靜態成員爲所有類對象所共享,不屬於某個具體的實例
<2>靜態成員變量必須在類外定義,定義時不添加static關鍵字
<3>類靜態成員即可用類名::靜態成員或者對象.靜態成員來訪問
<4>靜態成員函數沒有隱藏的this指針,不能訪問任何非靜態成員
<5>靜態成員和類的普通成員一樣,也有public、protected、private3種訪問級別,也可以具有返回值
<6>子類可以訪問父類的靜態成員
<7>靜態成員無多態特性

5.關於函數聲明
函數聲明中,參數名稱可以忽略不寫
eg:int Find( int , char );

6.C風格字符串相關
eg:、
char a="abcde";
char
b="abcde";
//此時a和b地址是相同的,都指向字符常量區的abcde
char c[]="abcde";
//此時c地址和a,b不同,因爲c是一個數組,數組數據是存在棧區
char d[]={‘a’,'b','c','d','e'};
//d和c雖然定義時看起來內容一樣,但是大小不同,使用“ ”初始化的數組會多出一個‘\0’元素

7.關於結構體大小的計算
普通計算:
由於內存對齊的問題,各個數據類型放的位置不同就會導致結構體的大小不一樣。

偏移量:結構體中的偏移量就是結構體成員和結構體變量的地址之差,比如說第一個結構體成員的偏移量就是0,第二個結構成員的偏移量就是第一個結構體成員的大小,假如第一個成員的是int b;那麼第二個結構體成員變量的偏移量就是4。

計算結構體大小的規則:

  1. 每一個成員的偏移量都必須是該成員的倍數。
  2. 結構體的大小必須是該結構體字節數最大成員的倍數。

有位段計算:
在32位cpu上選擇缺省對齊的情況下,每行支持4個字節即32bit
最後結構體大小爲 (行數*32)/8 字節

8.純虛函數
使用場景:
什麼情況下使用純虛函數(pure vitrual function)?
1.當想在基類中抽象出一個方法,且該基類只做能被繼承,而不能被實例化;
2.這個方法必須在派生類(derived class)中被實現;

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