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

C++ 類定義自訂資料型別:資料抽象、封裝與介面設計實踐

     編輯:關於C++

核心設計原則

  • 資料抽象:介面與實作分離,使用者只需知道「能做什麼」,不需知道「怎麼做」
  • 封裝:隱藏實作細節,透過 public/private 控制存取權限
  • 抽象資料型別 (ADT):類別定義一組操作介面,實作細節封裝於內部

關鍵語法機制

this` 指標

成員函數隱含參數,指向調用物件。型別為 ClassName* const(非 const 成員函數)或 const ClassName* const(const 成員函數)。

Const 成員函數

class Sales_data {
public:
    std::string isbn() const { return bookNo; } // 可被 const 物件調用
    Sales_data& combine(const Sales_data&);     // 非 const,可修改物件
private:
    std::string bookNo;
};

規則:const 物件/參考/指標只能調用 const 成員函數。

類別作用域與名稱查找

  • 類別即一作用域,成員函數巢狀定義其中
  • 編譯兩階段:先編譯所有宣告,再編譯函數體 → 成員函數可自由使用後宣告的成員
  • 類外定義需加類名限定:void Sales_data::combine(...)

建構子與初始化

class Sales_data {
public:
    Sales_data() = default;                    // C++11 顯式預設
    Sales_data(const std::string& s) : bookNo(s), units_sold(0), revenue(0) {}
    Sales_data(std::istream& is) { read(is, *this); }
private:
    std::string bookNo;
    unsigned units_sold = 0;                   // 類內初始值 (C++11)
    double revenue = 0.0;
};
  • 初始化列表:直接初始化成員,而非先預設再指派
  • 成員初始化順序 = 宣告順序,與初始化列表寫入順序無關
  • 委派建構子 (C++11):Sales_data() : Sales_data("") {}

拷貝控制

  • 拷貝建構子:Sales_data(const Sales_data&)
  • 拷貝指派:Sales_data& operator=(const Sales_data&)
  • 解構子:~Sales_data()
  • 預設行為:成員逐一拷貝/指派/銷毀
  • 管理動態記憶體類別必須自定義三者(或使用 std::vector/std::string 避免手動管理)

存取控制與友元

class Foo {
    friend void bar(Foo&);     // 友元函數
    friend class Baz;          // 友元類別
private:
    int secret;
};
  • 友元打破封裝,慎用
  • 宣告處指定存取權,不受類別作用域限制
  • 若需外部可調用友元,須額外在類外宣告

類型別名與巢狀類別

class Screen {
public:
    using pos = std::string::size_type; // 類型別名
    class Iterator { ... };             // 巢狀類別
};

可變資料成員

class Cache {
    mutable int accessCount; // const 成員函數中也可修改
public:
    int get() const { ++accessCount; return data; }
};

隱式型別轉換與 explicit

  • 單參數建構子定義隱式轉換路徑
  • explicit 防止隱式轉換,僅允許直接初始化
  • 標準庫慣例:單參數建構子預設加 explicit

聚合類與字面值常量類

  • 聚合類:全 public、無建構子、無類內初始值、無基類/虛函數 → 支援列表初始化
  • 字面值常量類:可用於 constexpr,需滿足字面值型別要求
  • constexpr 建構子/函數:編譯期計算,極大優化執行效能

靜態成員

class Account {
public:
    static double interestRate(); // 靜態成員函數,無 this
    static void rate(double);
private:
    static double rate_;          // 靜態資料成員
    static constexpr int period = 30; // 常量表達式,可類內初始化
};

// 類外定義(非 constexpr 必須)
double Account::rate_ = 0.05;
double Account::interestRate() { return rate_; }
  • 屬於類別而非物件,全體共享
  • 可透過物件/指標/參考或類名存取
  • 靜態成員函數無 this,不可 const
  • 定義放置於非內聯函數同一文件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved