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

C++ 類定義細節深度解析:成員、構造、const、static、友元與對象模型

     編輯:關於C++

成員變量與訪問控制

類可包含 public、private、protected 三種訪問級別的成員(數據、函數、類型別名)。
public:對所有代碼可見。
private:僅類內部成員、友元可見。
protected:類內部、友元、派生類可見。

構造函數與初始化列表

  • 構造函數同類名、無返回類型,用於初始化對象。
  • 初始化列表:Sales_item() : units_sold(0), revenue(0.0) {},在函數體執行前完成成員初始化,對 const、引用、無默認構造的類類型成員強制要求使用。
  • 成員初始化順序按聲明順序,而非列表順序;避免用未初始化成員初始化其他成員。
  • 默認構造函數:若用戶未聲明任何構造函數,編譯器隱式生成(內置類型不初始化,類類型調用默認構造)。

成員函數與 const 語義

  • 類內定義默認 inline;類外定義需 ClassName:: 作用域限定。
  • const 成員函數:double avg_price() const;,承諾不修改非 mutable 成員,this 類型為 const ClassName* const。
  • const 可作為重載依據:char& operator[](size_t) vs const char& operator[](size_t) const。
  • 構造函數不能聲明為 const。

mutable 與 static 成員

  • mutable 成員即使在 const 對象/函數中也可修改(如緩存、鎖計數器)。
  • static 數據成員:屬於類而非對象,需在類外定義並初始化(int ClassName::staticMember = 0;)。整型 const static 可在類內初始化(仍需類外定義但無需再賦值)。
  • static 成員函數:無 this 指針,只能訪問 static 成員,不可 const、不可 virtual。

友元機制

  • friend 可修飾普通函數、其他類成員函數、整個類。只能出現在類定義內部,不受訪問控制影響。
  • 友元非成員,不屬於類作用域;聲明時需限定所屬類(如 friend void Window_Mgr::clear();)。
  • 前向聲明依賴順序:先定義授予友元的類,再定義友元類/函數,最後定義友元函數體。

隱式轉換與 explicit

  • 單參數構造函數隱式定義類型轉換:item.same_isbn("9-999") 會隱構造 Sales_item 臨時對象。
  • 加 explicit 禁止隱式轉換,僅允許顯式構造:item.same_isbn(Sales_item("9-999"))。
  • 建議:除非有明確理由,單參數構造函數均加 explicit。

聚合初始化與前向聲明

  • 所有成員 public 且無構造函數時,可用花括號列表初始化:Data val = {1024, "Anna"};(順序同聲明順序)。
  • 前向聲明 class Foo; 僅引入類型名,不可用於定義對象、訪問成員、作為基類等需完整定義的場景。

總結

C++ 類機制細節繁多,核心原則是:初始化列表優先於賦值、const 語義貫穿始終、static 成員屬於類而非對象、友元打破封裝需謹慎使用、explicit 防止驚喜轉換。掌握這些規則能寫出高效、安全、可維護的 C++ 代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved