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

從 C 結構體到 C++ 類:封裝、構造/析構、this 指針與訪問控制完整指南

     編輯:關於C++

C 語言 struct 僅是數據聚合,無行為封裝。C++ class 引入訪問控制、成員函數、構造/析構函數、this 指針,實現真正的面向對象封裝。本文通過 Time 類演進,層層遞進講解核心機制。

1. 從 struct 到 class:訪問控制

關鍵字默認訪問適用場景
structpublic純數據載體(POD)、C 兼容
classprivate封裝行為與數據、不變量維護
// C 風格:數據暴露,外部隨意修改
struct Time { int hour, minute, second; };

// C++ 風格:私有數據,公有接口
class Time {
private:
    int hour, minute, second;
public:
    void setTime(int h, int m, int s);
    void tick();
    void show();
};

2. 構造函數:自動初始化

  • 同名無返回值,創建對象時自動調用。
  • 支持重載:Time()、Time(int h)、Time(int h,int m,int s)。
  • 初始化列表:Time(int h,int m,int s) : hour(h), minute(m), second(s) {} —— 必須用於 const/引用成員,效率更高。

3. 析構函數:自動清理

  • ~Time() {},對象銷毀前自動調用(棧對象離開作用域、delete 堆對象)。
  • 無參數、不可重載、不可拋出異常。
  • 管理動態資源(內存、文件句柄、鎖)的類必須定義析構函數(RAII)。

4. this 指針:隱式對象標識

  • 非靜態成員函數隱含參數 Time* const this。
  • 區分同名參數:this->hour = hour;。
  • 鏈式調用返回 *this:Time& setHour(int h) { hour=h; return *this; }。

5. 訪問控制三層級

級別本類派生類外部
private✓✗✗
protected✓✓✗
public✓✓✓

原則:數據成員 private;接口 public;供派生類擴展的內部實現 protected。

6. 構造/析構調用順序

class Base { public: Base() { cout<<"Base()"; } ~Base() { cout<<"~Base()"; } };
class Derived : public Base {
    Member m;
public:
    Derived() { cout<<"Derived()"; }
    ~Derived() { cout<<"~Derived()"; }
};
// 創建 Derived d;
// 輸出: Base() -> Member() -> Derived()
// 銷毀: ~Derived() -> ~Member() -> ~Base()
  • 基類 → 成員 → 派生類(構造);逆序析構。
  • 全局/靜態對象:構造在 main 前,析構在 main 後。

7. 完整示例:Time 類

class Time {
    int hour, minute, second;
public:
    Time() : hour(0), minute(0), second(0) {}
    Time(int h, int m, int s) : hour(h), minute(m), second(s) { normalize(); }
    
    void setTime(int h, int m, int s) { hour=h; minute=m; second=s; normalize(); }
    void tick() { second++; normalize(); }
    void show() const { printf("%02d:%02d:%02d\n", hour, minute, second); }
    
    ~Time() { /* 釋放資源,若無動態資源可省略 */ }
private:
    void normalize() {
        minute += second / 60; second %= 60;
        hour += minute / 60; minute %= 60;
        hour %= 24;
    }
};

最佳實踐清單

  1. 默認用 class + private 數據;struct 僅用於無行為數據塊。
  2. 所有構造函數使用初始化列表。
  3. 管理資源的類遵循 三/五/零法則:定義析構 → 定義拷貝/移動構造與賦值。
  4. const 正確性:只讀成員函數加 const。
  5. 避免在構造/析構中調用虛函數(動態綁定失效)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved