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

C++ 日期類別設計(一):從結構化到物件導向的思維轉變與封裝基礎

     編輯:關於C++

上月專欄介紹計算日期間隔的函數,本月改用 C++ 物件導向方法解決同一問題。核心在於創建新資料型別,使其行為如內建型別般自然——從「我想怎麼做」的函數導向,轉向「我的問題領域有哪些物件」的物件導向思維。

C++ 起源與學習階梯

  • C++ 起源於 80 年代初 AT&T Bjarne Stroustrup 的「帶類別的 C」,為在 C 語言效率基礎上引入 Simula-67 的類別概念進行模擬。
  • C++ 複雜但可漸進掌握三階層:更好的 C(型別安全、inline、const、參考、new/delete)→ 資料抽象(類別、存取控制、建構/解構、運算子多載、模板、異常)→ 物件導向(繼承、多態、虛擬函數)。

類別:擴充的 struct

類別除定義資料成員,可加入成員函數。日期類別定義(date.h):

class Date {
    int month, day, year;
public:
    Date();                 // 預設建構
    Date(int m, int d, int y); // 多參數建構
    Date interval(const Date& d2) const; // 計算間隔
    // 存取器
    int get_month() const { return month; }
    int get_day() const { return day; }
    int get_year() const { return year; }
};
  • :: 作用域運算子指明成員隸屬。
  • & 參數為參考傳遞,避免複製大物件。
  • 使用語法:result = d1.interval(d2);
  • 類別名即型別名,無需 typedef struct Date Date;。

建構函數:自動初始化

Date::Date() { month=1; day=1; year=1970; } // 預設
Date::Date(int m, int d, int y) { month=m; day=d; year=y; }

Date d; 呼叫預設建構;Date d(10,1,51); 呼叫多參數建構。物件定義可出現在任何區塊,支援延遲建構。

內聯函數取代巨集

將簡單成員函數移入類別定義內成內聯(如 isleap),兼具巨集展開效率與函數型別檢查、作用域規則。C++ 中除預處理器字串化/標記連接外,不需函數式巨集。

this 指標與成員存取

成員函數內無前綴的成員名(如 year)隱含指向呼叫物件(d1.year)。可用 this->year 明確表達,但鮮用。

封裝:存取控制與存取器

直接存取 d1.month = 20; 會導致無效狀態。解決:將資料設為 private,提供 const 存取器:

class Date {
private:
    int month, day, year;
public:
    int get_month() const { return month; }
    // ...
    Date interval(const Date&) const; // const 成員不修改物件
};

改用 class 關鍵字(預設 private)取代 struct,更符合封裝慣例。

C++ 參考詳解

參考是物件別名,宣告即初始化,不可重新綁定,無需 &/* 操作,可視為「自動解參考的 const 指標」。

  • 參考傳遞:void swap(int&, int&) 實現真正交換。
  • 大型物件傳遞:void f(const BigType&) 避免複製開銷。
  • 回傳參考:允許 func() = value; 將函數呼叫置於賦值左側。
int& current() { return a[index]; }
current() = 10; // 修改 a[0]

下月預告

將整合輸入輸出流、靜態成員、運算子多載,完成功能完備的日期類別。

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