首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 核心技術精要:指針、頭文件、初始化列表與 11 大編程要點

     編輯:關於C++

指針:C 語言的靈魂與陷阱

指針擁有「值」與「地址」雙重屬性,賦予 C 語言直接操作內存的能力,也引發無數錯誤。核心在於時刻明確:當前使用的是指針的值(地址),還是其指向的值?

  • & 取地址(需左值),用於初始化。
  • * 取值,返回左值。

指針賦值 vs 值賦值:p1 = p2 令兩指針指向同一地址;*p1 = *p2 將 p2 指向內容拷貝至 p1 指向內存。指針本身佔用存儲空間(32 位系統 4 字節),存儲所指對象地址。

指針運算 與所指類型相關:p++ 步進大小等於 sizeof(*p)。

指針與數組的關鍵區別

聲明 int array[5] 分配內存;int* p 僅分配指針變量本身,不分配目標內存。數組名非左值,不可賦值;作為函數參數時退化為指針(char* argv[] 實為 char** argv)。跨文件聲明時,extern char* myname 與 char myname[] 內存佈局不同,必須保持一致。

頭文件包含藝術

包含形式

  • #include <header>:系統庫頭文件,搜索標準路徑。
  • #include "header":用戶頭文件,優先搜索當前目錄。

包含衛哨

內部衛哨(頭文件內):#ifndef _HEADER_H_ #define _HEADER_H_ ... #endif 防止重複包含。
外部衛哨(包含處):#if !defined(_HEADER_H_) #include <header> #define _HEADER_H_ #endif 提升編譯速度。建議兩者使用同一宏名。

合理包含順序

頭文件中:自定義 → 第三方庫 → 標準庫。
源文件中:對應頭文件 → 自定義 → 第三方庫 → 標準庫。
避免重定義錯誤,善用 #ifndef 保護。

C++ 成員初始化列表:必須與高效

構造順序:分配內存 → 初始化列表初始化成員 → 進入構造函數體執行賦值。

必須使用場景:
1. 成員無默認構造函數(僅有帶參構造)。
2. const 成員或引用成員(聲明即初始化,不可賦值)。

效率考量:初始化列表直接調用構造函數;構造函數體內賦值則涉及默認構造 + 拷貝賦值,對類類型成員開銷大。

順序陷阱:初始化順序按成員聲明順序,而非列表書寫順序。保持一致避免微妙 Bug。

C++ 11 大編程要點速覽

  1. 拋棄 <iostream.h>,使用標準 <iostream>(模板化、命名空間 std、接口改進)。
  2. 引用參數加 const:允許綁定臨時對象,防止意外修改。
  3. 逗號表達式:if (++x, --y, cin.good()) 取最右值;慎用以免降低可讀性。
  4. 全局對象構造函數執行早期初始化(日誌激活、註冊等)。
  5. 避免複雜函數指針語法,用 typedef 分層簡化(如 typedef void (*pfv)(); typedef void (*pf_taking_pfv)(pfv);)。
  6. 指向成員指針:int A::*pmi = &A::num; 數據成員;int (A::*pmf)() = &A::func; 函數成員。支持多態,不可取構造/析構函數地址。
  7. 防內存碎片:少用動態分配,優先靜態/自動存儲或 STL 容器;大塊分配代替小塊頻繁分配。
  8. 區分 delete 與 delete[]:數組必須用 delete[],否則行為未定義。
  9. 優化成員排列減小對象尺寸:將相同類型聚合,減少填充字節(bool, bool, int 比 bool, int, bool 節省 4 字節)。
  10. 基類必須有虛析構函數:否則 delete 基類指針不會調用派生類析構函數,導致資源洩漏。
  11. 嵌套類友元聲明放後面:先聲明嵌套類,再 friend class Nested;,否則編譯器忽略後續聲明。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved