C++中常見的類特性

一、構造函數:初始化類成員

class MyClass {
public:
    MyClass(int value):m_value(value) {}
private:
    int m_value;
};

MyClass myObject(5);

構造函數用於初始化類的成員變數,在對象被創建時被自動調用。在上面的例子中,MyClass類的構造函數需要一個int類型的參數,並將它存儲在m_value成員變數中。當調用MyClass myObject(5)時,將創建一個名為myObject的MyClass類對象,其m_value成員變數的值為5。

二、析構函數:釋放類資源

class MyClass {
public:
    ~MyClass() { cout<<"Destructor called"<<endl; }
};

MyClass* myObject = new MyClass(); //創建對象
delete myObject;                   //釋放對象

析構函數用於釋放類所佔用的資源,在對象被銷毀時自動調用。在上面的例子中,MyClass類的析構函數沒有參數,且沒有任何實際作用,只是輸出一行信息。當使用new運算符創建一個MyClass類對象時,將為該對象分配內存,當使用delete運算符釋放該對象時,將自動調用MyClass類的析構函數來釋放該對象佔用的內存。

三、訪問器函數:獲取私有成員變數的值

class MyClass {
public:
    int getValue() const { return m_value; }
private:
    int m_value;
};

MyClass myObject;
int value = myObject.getValue(); //獲取m_value的值

訪問器函數也稱為getter函數,用於獲取類中私有成員變數的值。在上面的例子中,MyClass類定義了一個名為getValue的訪問器函數,該函數返回m_value成員變數的值。當調用myObject.getValue()時,將返回myObject對象的m_value成員變數的值。注意,該訪問器函數使用const關鍵字來表明它不修改對象。

四、修改器函數:修改私有成員變數的值

class MyClass {
public:
    void setValue(int value) { m_value = value; }
private:
    int m_value;
};

MyClass myObject;
myObject.setValue(10); //將m_value的值設置為10

修改器函數也稱為setter函數,用於修改類中私有成員變數的值。在上面的例子中,MyClass類定義了一個名為setValue的修改器函數,該函數將傳入的參數設置為m_value成員變數的值。當調用myObject.setValue(10)時,將設置myObject對象的m_value成員變數的值為10。

五、靜態成員變數:類級別的變數

class MyClass {
public:
    static int s_value;
};

int MyClass::s_value = 0;

MyClass myObject1;
MyClass myObject2;
myObject1.s_value = 5; //設置s_value的值為5
cout<<myObject2.s_value; //輸出5

靜態成員變數是屬於整個類的,所有該類的對象共享一個靜態成員變數。如上例中,MyClass類定義了一個靜態成員變數s_value,類內部沒有初始化它的值,需要在類外部進行初始化。當聲明多個MyClass類對象時,這些對象共享該靜態成員變數,可以通過任何一個對象對其進行修改,其他對象均會受到影響。

六、友元函數:訪問類的私有成員

class MyClass {
public:
    friend int getPrivateValue(MyClass obj); //聲明友元函數
private:
    int m_value;
};

int getPrivateValue(MyClass obj) { return obj.m_value; } //定義友元函數

MyClass myObject;
myObject.m_value = 10; //無法直接訪問m_value
int value = getPrivateValue(myObject); //使用友元函數獲取m_value的值

友元函數不是類成員函數,但是可以訪問類的私有成員。在上例中,MyClass類定義了一個名為getPrivateValue的友元函數,在函數內部可以訪問MyClass類的私有成員變數m_value。當需要訪問該成員變數時,可以通過調用getPrivateValue函數來實現。

七、常量成員函數:不修改成員變數的函數

class MyClass {
public:
    int getValue() const { return m_value; } //常量成員函數
private:
    int m_value;
};

MyClass myObject;
int value = myObject.getValue(); //調用常量成員函數

常量成員函數表示它不會修改類的任何成員變數,因此它被認為是一個「安全」函數。通過在函數末尾使用const關鍵字,可以將該函數聲明為常量成員函數。在上例中,MyClass類定義了一個名為getValue的常量成員函數,該函數不修改m_value成員變數的值。常量成員函數與訪問器函數的語法非常相似,它們都不允許修改類的成員變數。

八、虛函數:用於多態性的實現

class Animal {
public:
    virtual void speak() { cout<<"Animal"<<endl; } //虛函數
};

class Cat : public Animal {
public:
    void speak() { cout<<"Meow"<<endl; }
};

class Dog : public Animal {
public:
    void speak() { cout<<"Woof"<speak(); //輸出「Meow」

虛函數用於實現多態性,它可以讓程序在運行時動態調用適當的子類函數。在上例中,定義了一個虛函數speak,它是Animal類的成員函數,並在Cat和Dog子類中進行了重寫。當使用Animal*類型的指針指向Cat對象時,可以調用speak函數來輸出「Meow」,因為該對象是Cat類型的。

九、純虛函數:沒有實現的虛函數,需要由子類實現

class Animal {
public:
    virtual void speak() = 0; //純虛函數
};

class Cat : public Animal {
public:
    void speak() { cout<<"Meow"<speak(); //輸出「Meow」

純虛函數是一種虛函數,它沒有實現,需要由其子類進行實現。在Animal類中,定義了一個名為speak的純虛函數,它沒有任何實際的代碼實現。當創建一個子類,並從Animal類中繼承時,需要實現speak函數。在上面的例子中,Cat子類實現了speak函數,並可以被Animal類指針調用。

十、繼承:子類繼承父類的特性

class Animal {
public:
    void eat() { cout<<"I am eating"<<endl; }
};

class Cat : public Animal {
public:
    void meow() { cout<<"Meow"<<endl; }
};

Cat myCat;
myCat.eat();  // 輸出"I am eating"
myCat.meow(); // 輸出"Meow"

繼承允許子類繼承父類的特性,包括成員變數和成員函數。在上例中,Cat子類繼承了Animal父類的成員函數eat。當創建一個myCat對象時,可以調用它繼承的eat函數。

十一、多重繼承:子類繼承多個父類的特性

class Animal {
public:
    void eat() { cout<<"I am eating"<<endl; }
};

class Vehicle {
public:
    void drive() { cout<<"I am driving"<<endl; }
};

class CatBus : public Animal, public Vehicle {
public:
    void meow() { cout<<"Meow"<<endl; }
};

CatBus myCatBus;
myCatBus.eat();   // 輸出"I am eating"
myCatBus.drive(); // 輸出"I am driving"
myCatBus.meow();  // 輸出"Meow"

多重繼承允許子類同時繼承多個父類的特性。在上例中,CatBus子類同時繼承了Animal和Vehicle兩個父類的特性。當創建一個myCatBus對象時,可以調用它繼承的eat和drive函數。

原創文章,作者:HFFQ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/143436.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
HFFQ的頭像HFFQ
上一篇 2024-10-19 16:43
下一篇 2024-10-19 16:43

相關推薦

  • Python計算機語言的特性與應用

    Python,是一種高層次、解釋型的、面向對象的計算機編程語言。 一、簡介 Python編程語言的初衷是:代碼簡潔易讀、可拓展性強、適用範圍廣。其應用領域包括Web開發、數據科學、…

    編程 2025-04-29
  • Python常見異常類型解析

    本文將闡述Python常見異常類型,包括其定義、分類及處理方法。 一、語法錯誤 語法錯誤是指在Python代碼編寫過程中出現的錯誤,這是一種最常見的錯誤類型。當Python解釋器無…

    編程 2025-04-27
  • Python列表的特性

    Python列表是一種能夠保存任意對象的動態數組結構。Python列表具有以下特性: 一、可變性 Python列表是可變的,可以動態改變其元素。可以通過索引來訪問和修改列表中的元素…

    編程 2025-04-27
  • Java8特性詳解

    Java8是Java語言的一個重要版本。有很多新的特性被加入,比如Lambda表達式、方法引用、Stream API等。這些特性提供了更為一致、緊湊的代碼風格和更好的可讀性,使得J…

    編程 2025-04-25
  • Grep 精準匹配:探究匹配原理和常見應用

    一、什麼是 Grep 精準匹配 Grep 是一款在 Linux 系統下常用的文本搜索和處理工具,精準匹配是它最常用的一個功能。Grep 精準匹配是指在一個文本文件中查找與指定模式完…

    編程 2025-04-25
  • Java 14:新的特性和改進

    一、Records Java 14中引入了Records,這是一種新的類聲明,用於聲明輕量、不可變值類。Records類似於傳統Java類,但通過簡化聲明,目的是更容易地定義數據聚…

    編程 2025-04-25
  • MySQL常見面試題

    一、基礎知識 1、MySQL的優點和缺點 MySQL是一個開源的關係型資料庫管理系統,擁有以下優點: (1)開源免費,可以節省成本; (2)支持多種操作系統; (3)易於使用和管理…

    編程 2025-04-24
  • Java 8特性詳解

    一、Lambda表達式 1、Lambda表達式是Java 8中最大的特性之一,它提供了一種簡潔的方式來寫匿名內部類。Java 8中,Lambda表達式的格式為(parameters…

    編程 2025-04-23
  • 常見激活函數詳解

    一、Sigmoid函數 Sigmoid函數是最經典的激活函數之一,具有將實數映射到(0, 1)的特性,其公式如下: def sigmoid(x): return 1 / (1 + …

    編程 2025-04-23
  • JTextField:Java中常見的文本輸入框控制項

    JTextField是Java Swing控制項庫中的一種常見的用於文本輸入的控制項,它提供了許多實用的特性與靈活的可擴展性。在本文中,我們將從多個方面對JTextField進行詳細的…

    編程 2025-04-22

發表回復

登錄後才能評論