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

C++ 核心筆記 (一):類別與物件基礎完整指南

     編輯:關於C++

第一章 類別與物件:物件導向的基石

物件 是客觀事物在電腦中的抽象描述,封裝資料 (屬性) 與操作 (方法/行為)。類別 是擁有相同屬性與行為的一群物件的統一描述,也是一種使用者定義型別 (User-Defined Type)。物件則是該型別的實例 (變數)。

1. 類別定義語法


class ClassName {
private:    // 私有:僅類別內部成員函式可存取 (預設)
    // 資料成員 / 成員函式
protected:  // 保護:類別內部 + 衍生類別可存取
    // 資料成員 / 成員函式
public:     // 公有:任何程式碼皆可存取 (介面)
    // 建構函式、解構函式、公用介面函式
}; // 分號不可漏
  • class 關鍵字定義類別,慣例類別名首字母大寫 (PascalCase)。
  • 三種存取權限:private (預設)、protected、public。封裝原則:資料成員盡量 private,提供 public 成員函式存取。
  • 成員函式可在類別內內聯定義 (適合簡短函式),或僅宣告原型,類別外用 ReturnType ClassName::FuncName(Params) { ... } 定義。

2. 成員函式定義


// 類別內宣告
void SetValue(int v);
int GetValue() const;

// 類別外定義 (需作用域解析運算子 ::)
void MyClass::SetValue(int v) { value = v; }
int MyClass::GetValue() const { return value; }

:: 稱為作用域解析運算子,指明函式隸屬哪個類別。成員函式可帶預設參數。

3. 物件宣告與指標


MyClass obj;           // 區域/全域/靜態物件
MyClass obj1, obj2;    // 多個物件
MyClass* ptr = &obj;   // 指向物件的指標
MyClass& ref = obj;    // 物件參考 (別名)

物件建立時自動呼叫建構函式,銷毀時自動呼叫解構函式。

4. 存取成員

5. 類別成員指標

指向類別非靜態資料成員 的指標,非物件指標,不佔用物件記憶體:


class MyClass { public: int data; };
int MyClass::* pData = &MyClass::data; // 成員指標宣告

MyClass obj;
obj.*pData = 10;       // 透過物件存取
MyClass* ptr = &obj;
ptr->*pData = 20;      // 透過指標存取

成員指標型別包含類別名,確保型別安全。僅能存取 public 成員 (或友元內部)。

6. this 指標

  • 每個非靜態成員函式 皆隱含一個 MyClass* const this 參數,指向呼叫該函式的物件。
  • 編譯器自動插入 this-> 存取資料成員 (如 m = 10; 實為 this->m = 10;)。
  • 用途:區分同名區域變數、回傳 *this 實作鏈式呼叫、將物件位址傳遞給其他函式。
  • 靜態成員函式無 this 指標,不可存取非靜態成員。

7. 物件指派


MyClass a(1), b(2);
b = a; // 逐位元複製所有非靜態資料成員 (預設指派運算子)

若類別管理資源 (指標、控制代碼),必須自訂指派運算子 實作深層複製/引用計數/移動語意。

8. 物件作用域與生命週期

方式語法條件
物件直接存取obj.member物件、參考
指標存取ptr->member指標已指向有效物件
類型建立時機銷毀時機範例
區域物件執行到宣告處離開區塊 (} )函式內 MyClass obj;
區域靜態物件首次執行到宣告處程式結束函式內 static MyClass obj;
全域物件程式啟動 (main 前)程式結束檔案作用域 MyClass g_obj;
全域靜態物件程式啟動程式結束檔案作用域 static MyClass g_obj; (內部連結)

9. 動態配置物件 (Heap Object)


MyClass* p = new MyClass(10); // 配置記憶體 + 呼叫建構函式
// ... 使用 p-> ...
delete p; // 呼叫解構函式 + 釋放記憶體

// 陣列
MyClass* arr = new MyClass[10]; // 呼叫 10 次預設建構函式
delete[] arr; // 呼叫 10 次解構函式 + 釋放記憶體
  • new 失敗拋出 std::bad_alloc (或舊標準傳回 nullptr,視編譯器選項)。
  • 動態物件生命週期由程式設計師控制 (new/delete 配對),必須確保不洩漏、不重複釋放、不使用已釋放記憶體。
  • 現代 C++ 建議使用智慧指標 (std::unique_ptr, std::shared_ptr) 管理動態物件。

10. 物件陣列


MyClass arr[10];          // 靜態陣列:10 個物件,各呼叫預設建構函式
MyClass arr[3] = {        // 列表初始化 (C++11)
    MyClass(1), MyClass(2), MyClass(3)
};
// 動態陣列見上節

陣列元素為完整物件,依序建構、逆序解構。

完整範例程式


#include <iostream>
#include <string>
using namespace std;

class Student {
    string name;
    int    id;
public:
    Student(const string& n, int i) : name(n), id(i) {
        cout << "建構: " << name << endl;
    }
    ~Student() {
        cout << "解構: " << name << endl;
    }
    void Print() const {
        cout << "學生: " << name << " (ID: " << id << ")" << endl;
    }
};

int main() {
    Student s1("Alice", 1001);      // 區域物件
    Student* s2 = new Student("Bob", 1002); // 動態物件

    s1.Print();
    s2->Print();

    delete s2; // 手動釋放
    return 0;  // s1 此處自動解構
}

輸出順序:建構 Alice → 建構 Bob → 列印 Alice → 列印 Bob → 解構 Bob (delete) → 解構 Alice (main 結束)。

重點總結

概念核心規則
類別封裝資料與操作、三種存取權限、定義以分號結尾
物件類別的實例、自動建構/解構、作用域決定生命週期
成員存取obj.member、ptr->member
this非靜態成員函式隱含參數、指向呼叫物件、不可修改
動態物件new/delete 配對、建議改用智慧指標
陣列元素為完整物件、依序建構/逆序解構
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved