C++類的定義與實現

文章轉自 微信公眾號:Coder梁(ID:Coder_LT)

一、類的定義

根據C++ Primer中的描述,類的定義是一種將抽象轉換為用戶定義類型的C++工具。也就是說類的實質是一種用戶自定義類型,它可以將數目表示和操作數據的方法組合成一個整潔的包。

在實際開發當中,想要實現一個類,並編寫一個使用它的程序是相對比較復雜的,涉及多個步驟。

通常,我們會將類的定義放在頭文件當中,並將實現的代碼放在源代碼文件中。我們來看C++ Primer當中的一個例子:一個關於股票買賣的類。

首先是類的定義,寫在stock00.h文件中:

#ifndef STOCK00_H_
#define STOCK00_H_

#include <string>

class Stock {
    private:
     std::string company;
     long shares;
     double share_val;
     double total_val;
     void set_tot() {total_val = shares * share_val;}
    public:
     void accquire(const std::string &co, long n, double pr);
     void buy(long num, double price);
     void sell(long num, double price);
     void update(double price);
     void show();
};
#endif

首先是關鍵字class,它表示我們聲明的是一個類,一般類名我們使用大駝峰命名法定義。

其次在這個類的定義當中,我們看到瞭兩個新出現的關鍵字privatepublic。這兩個關鍵字描述瞭對類成員的訪問控制,使用類對象的程序,都可以直接訪問公有部分(public),但無法訪問對象的私有成員。

想要獲取私有成員,隻能通過公有的成員函數。比如在上面這個例子當中,我們想要修改share_val隻能通過公有的方法sellbuy,而無法直接對變量的值進行修改。防止程序直接訪問數據修改數據被稱為數據隱藏。

除瞭publicprivate,C++當中還提供瞭第三個關鍵字叫做protected,這個關鍵字和類的繼承有關,我們將會在之後的文章當中進行討論。

數據隱藏的思想其實是認為類中的成員變量的所有權應該屬於類本身,當我們需要對類中的數據進行讀取和修改的時候,應當通過類提供的公開方法,而不是直接操作類中值。這被認為是一種面向對象的思想,即隻能通過類提供的方法訪問數據,而不應該直接訪問數據。

C++正是基於這種面向對象的思想設計的,所以類中的成員默認是private的,我們可以省去private關鍵字:

class World {
    float mass;
    char name[30];

public:
    void tellall();
    ...
};

我們從類的描述看上去很像是包含瞭成員函數以及數據隱藏的結構體,但實際上這是因為C++對結構體進行瞭拓展,讓它具有瞭和類相同的特性。在C語言當中,結構體是沒有這麼多特性的。

比如我們可以給結構體設計構造函數,也可以給結構體添加成員函數,甚至結構體也可以繼承、派生和多態。

它們之間唯一的區別是,結構體的默認類型是public,而類是private。所以通常使用類來實現對象,而結構體隻用來結構化地存儲數據。

另外多說一句,數據隱藏的面向對象理念並不適用於所有語言。比如Python,Python當中的類中的成員變量默認是public,且沒有private關鍵字。

二、類的實現

當我們完成瞭類定義之後, 還需要來實現類當中的函數。

比如我們在stock00.h當中定義瞭一個類:

#ifndef STOCK00_H_
#define STOCK00_H_

#include <string>

class Stock {
    private:
     std::string company;
     long shares;
     double share_val;
     double total_val;
     void set_tot() {total_val = shares * share_val;}
    public:
     void accquire(const std::string &co, long n, double pr);
     void buy(long num, double price);
     void sell(long num, double price);
     void update(double price);
     void show();
};
#endif

1.成員函數

在這個定義當中,我們隻是聲明瞭函數,並沒有具體實現函數的邏輯。

我們通常會在同名的cpp文件當中實現,實現的時候,需要使用作用域解析運算符來表示函數所屬的類:

void Stock::update(double price) {
    ...
}

這樣就表明瞭update函數所屬Stock這個類,這也就意味著我們可以創建屬於其他類的同名函數:

void Buffoon::update() {
    ...
}

其次,我們在成員函數當中,可以訪問private限定的成員變量。比如說在show函數當中,我們可以這樣實現:

void Stock::show() {
    std::cout << company << shares << share_val << total_val << endl;
}

雖然company,shares都是類的私有成員,但在成員方法當中,一樣可以正常訪問。

再次,我們在成員方法當中調用另外一個成員方法,可以不需要解析運算符。比如我們要在show函數內調用update函數,直接使用update()即可,而無需前面的Stock::。

2.內聯函數

我們再回過頭來看一下Stock這個類的定義,在類的定義當中,有一個叫做set_tot的函數。我們直接在類當中實現瞭邏輯。雖然同樣是成員函數,但是在類當中直接實現的函數是有所區別的。在類聲明當中實現的函數,會被視為是內聯函數。

一般我們會把一些比較簡短的函數在類的聲明當中直接實現,當然我們也可以使用關鍵字inline,手動指定某個函數是內聯的。

class Stock {
    private:
    void set_tot();
    public:
    ...
};

inline void Stock::set_tot() {
    total_val = shares * share_val;
}

到此這篇關於C++類的定義與實現的文章就介紹到這瞭,更多相關C++類的定義與實現內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: