C++成員函數:類的行爲實現方法

什麼是成員函數?

在C++中,是一種自定義的數據類型,它可以包含成員變量(描述對象的屬性)和成員函數(定義對象的行爲)。成員函數是類的“行爲接口”,它決定了對象可以執行哪些操作。比如,一個Person類可能有nameage作爲成員變量,而greet()就是一個成員函數,用於讓對象“打招呼”。

成員函數的定義

成員函數可以在類內部定義(直接寫在類的大括號內),也可以在類外部定義(需要通過“類名::”指定作用域)。

1. 類內定義(最常用)
直接在類中聲明並實現函數:

class Person {
public:
    // 成員變量:描述對象的屬性
    string name;
    int age;

    // 成員函數:定義對象的行爲(打招呼)
    void greet() {
        // 成員函數可以直接訪問類的成員變量
        cout << "Hello! I'm " << name << ", " << age << " years old." << endl;
    }
};

2. 類外定義(需指定作用域)
如果函數體較長,通常將聲明放在類內,定義放在類外,並通過類名::明確函數歸屬:

class Person {
public:
    string name;
    int age;
    void greet(); // 類內聲明
};

// 類外定義成員函數,需加作用域Person::
void Person::greet() {
    cout << "Hello! I'm " << name << ", " << age << " years old." << endl;
}

成員函數如何訪問成員變量?

成員函數內部可以直接使用類的成員變量(無需額外聲明),這是因爲每個成員函數都隱含一個this指針——它指向調用該函數的對象。例如,this->name等價於name(編譯器會自動添加this->)。

示例
假設我們創建兩個Person對象:

Person p1, p2;
p1.name = "Alice";
p1.age = 20;
p1.greet(); // 調用p1的greet()

p2.name = "Bob";
p2.age = 25;
p2.greet(); // 調用p2的greet()

此時,this指針會分別指向p1p2,因此greet()會根據當前對象動態輸出不同內容。

如何調用成員函數?

通過對象調用成員函數,使用“對象名.函數名()”語法(或指針/引用用“->”)。

示例

int main() {
    Person p;
    p.name = "Charlie";
    p.age = 30;
    p.greet(); // 輸出:Hello! I'm Charlie, 30 years old.
    return 0;
}

特殊成員函數

除了普通成員函數,類還有幾個特殊成員函數,用於初始化和清理對象:

1. 構造函數
創建對象時自動調用,用於初始化成員變量。構造函數名與類名相同,無返回值:

class Person {
public:
    string name;
    int age;

    // 構造函數:初始化name和age
    Person(string n, int a) {
        name = n;
        age = a;
    }

    void greet() {
        cout << "Hello! I'm " << name << ", " << age << " years old." << endl;
    }
};

// 使用構造函數創建對象
Person p("David", 35); // 直接初始化name和age
p.greet(); // 輸出:Hello! I'm David, 35 years old.

2. 析構函數
對象銷燬時自動調用,用於釋放資源(如內存、文件句柄等)。析構函數名以“~”開頭,無參數:

class Person {
public:
    ~Person() {
        cout << "對象已銷燬,清理資源!" << endl;
    }
};

成員函數的訪問權限

成員函數和成員變量一樣,也有訪問權限控制(public/private/protected):

  • public(公有):類內外都可調用,對外提供接口。
  • private(私有):僅類內部可調用,隱藏實現細節。
  • protected(保護):僅類內部和子類可調用(繼承時使用)。

示例

class Person {
private:
    string secret; // 私有成員變量

    void internalGreet() { // 私有成員函數
        cout << "Secret: " << secret << endl;
    }

public:
    void setSecret(string s) {
        secret = s; // 公有函數可修改私有變量
    }

    void publicGreet() {
        internalGreet(); // 公有函數可調用私有函數
    }
};

int main() {
    Person p;
    p.setSecret("I'm 200 years old!"); // 合法:通過公有函數設置
    p.publicGreet(); // 合法:調用公有函數間接訪問私有函數
    // p.internalGreet(); // 錯誤:無法直接調用私有函數
    return 0;
}

總結

成員函數是C++類的核心:
1. 它將“屬性(成員變量)”和“行爲”封裝在類中,讓對象具有特定功能。
2. 通過對象.函數名()調用,this指針確保函數與對象綁定。
3. 構造函數初始化對象,析構函數清理資源,public/private控制訪問權限。

理解成員函數後,你就能用類創建更復雜的對象,並讓它們執行各種自定義行爲了!

小夜