C C 易錯56條,乾貨

2021-09-27 10:10:11 字數 2561 閱讀 1859

1.inline是給編譯器的建議,函式放在標頭檔案中並在定義時新增,在類宣告時直接寫的方法體,等同與新增了inline內聯;

2.struct、class、enum、union最後面記得加分號,namespace最後沒有分號;

3.預設引數是宣告時使用的,預設引數必須在後邊;

4.virtual 在父類中宣告才有意義,只在子類中宣告是錯誤的。子類中的virtual是可有可無的,一般加上用來標示一下;

5.extern 用在宣告時,表示在別處定義了,在.h中定義的函式預設是extern的,但是變數有自己新增;

6.c++03類模板可以有預設引數,但是函式模版不能有預設模版引數,c++0x提供了函式預設模版引數的支援;

7.static在檔案中修飾變數說明這個變數在其他檔案中是不可見的;

8.switch語句的case只能是常量數字(列舉)或者字元;

9.有符號的移位運算和無符號的移位運算是不同的,並且分為算術移位和邏輯移位;

10.巨集定義時新增下面**來防止產生錯誤;

#define macro dowhile(0)

11.const的類成員函式在初始化列表中初始化,static的成員函式需要在類外定義初始化,const static可以直接在類中初始化也可以和static一樣在類外定義時初始化;

12.只是返回值不同不能作為過載;

13.二義性問題需要注意;

14.delete null是合法的且不會產生錯誤的;

15.對指標進行加減法的步長取決於它指向的型別;

16.採用加法來交換兩個數值容易產生溢位,可以採用異或來做;

17.直接賦值的char指標是常量字串,不能修改;

18.傳遞進函式的指標內容可以修改,對它本身的修改是錯誤的,需要時需要傳遞指標的指標;

19.注意區別編譯器提供的擴充套件;

20.c++比c有更強的型別檢查,有些在c中不需要型別轉換的,在c++中需要顯示的使用型別轉換;

21.函式返回值和引數的傳遞都會產生副本;

22.返回區域性變數的引用或者指標是錯誤的,返回值是正確的,因為它會返回乙個副本;

23.成員函式指標是強型別的,進行轉換是需要顯示轉換,靜態成員函式可以直接用普通函式指標來訪問;

24.靜態成員函式不能使用virtual、const、volatile修飾,靜態函式是類的不存在虛函式表所以不能是virtual的(其他兩個不知道為什麼);

25.靜態成員函式只能操作類變數,沒有this指標;

26.dynmaic_cast只支援指標和引用的型別轉化,且做執行時型別檢測,其他轉化不會;

27.sizeof的結果與位元組對齊和pack有關;

28.sizeof乙個空的類結果是1;

29.下面**只能解決重複包含,不能解決重複定義;

#ifndef macro

#define macro

#endif

30.goto是個好東西;

31.模版的export關鍵字不被支援,分離定義模型不被支援;

32.boost庫很好用,但是很容易用錯;

33.自己不能確定的運算子優先順序就用括號吧;

34.string::c_str()返回的是const char*;

35.保持函式成員變數宣告順序和初始化列表順序一致;

36.只有指標的引用,沒有指向引用的指標;

37.因為c++在c的函式庫的名稱前做了修改做過載的特性,c++使用c的庫時需要在函式前加extern『c』;

38.const函式只能呼叫const函式,不能呼叫非const函式;

39. ->,.,::的優先順序高於*,&;

40.不要因為編譯器支援而省略應該包含的標頭檔案;

41.c中struct、enum、union定義的型別在宣告變數時需要這些關鍵字,而在c++中則不需要;

42.你可以在c++中巢狀enum來給它加限定,但是在c中這似乎是無效的;

43.enum使用時不要把名稱加在前面,enum的成員是全域性的;

44.常量成員函式不能呼叫非常量成員函式;

45.常量成員物件只能呼叫常量成員函式,構造和析構函式除外;

46.移位運算分為邏輯移位(shl/shr)和算術移位(sar/sal),而c中的移位運算無符號數是邏輯移位,有符號數是算數移位;

47.函式過載,模版推演只針對於引數,如果返回值是模版需要顯示指定型別;

48.為了保持可移植,路徑使用/來分割,而不是用;

49.注意路徑和檔案的大小寫。

50.巢狀模板時注意用空格分割一下尖括號,即使c++11已經優先解釋成巢狀模板了;

51.windows平台使用的wchar_t可能會在linux平台上有相容性問題;

52.只有引數是const的引用才能將返回值直接做引數傳遞,其他的你都需要為他宣告乙個變數;

53.有符號數進行型別轉換時,是按照高位填充補全的,即最高位是1,填充的高位也會是1,會引起數值的變化;

54.如果子類存在和基類同名的函式,如果不過載/覆蓋就會被隱藏,如果要使用就要顯示using base::fun;

55.存在多型的關係的類,基類析構函式必須顯示定義,並且應為virtual。

56.含有c++的型別的結構(比如std::string)不要用malloc來分配記憶體

C C 易錯總結

一 分析如下 char tostr int num s i 0 return s 本意為將整數轉化成字元陣列儲存,然後將這個字元陣列返回。經艱苦實踐,發現不能,原因是指標s是區域性變數,當函式返回時s即銷毀,當然不會返回成功了,只能把乙個無意義的位址傳回去。所以正確的處理方法可以這樣。void to...

C C 易錯問題分析

傳給函式形參的實參是作為拷貝傳入,在函式體內改變作為拷貝的實參2是不會影響到傳入的實參1的。規則 1 如果想要通過函式介面改變傳入的數值,那麼需要傳入該數值的指標。2 如果想要改變傳入的指標所指向的值,那麼需要傳入該指標的指標。總之,需要深一層。int fun int fun1 修改方法 由上層呼叫...

C C 常用函式易錯點

include void memset void buffer,int ch,size t count 將記憶體中buffer的前count個 位元組的內容全部設定為ch指定的ascii值.經常用來初始化陣列.複製時 以位元組為單位,如果buffer是int long,或者其他型別的指標時,需要注意...