C++中的資料抽象



資料抽象是指只向外界提供必要的資訊,並隱藏其背後的細節,即在程式中表示所需的資訊,而無需呈現細節。

資料抽象是一種程式設計(和設計)技術,它依賴於介面和實現的分離。

讓我們以電視機的真例項子為例,您可以開啟和關閉電視機,更改頻道,調整音量,並新增外部元件,如揚聲器、錄影機和 DVD 播放器,但您不知道其內部細節,也就是說,您不知道它是如何接收無線訊號或透過電纜接收訊號的,如何對其進行轉換,以及最終如何在螢幕上顯示它們。

因此,我們可以說電視機清楚地將其實現細節與外部介面分離開來,您可以使用其介面,如電源按鈕、頻道切換器和音量控制,而無需瞭解其內部結構。

在 C++ 中,類提供了極佳的資料抽象水平。它們向外界提供了足夠多的公共方法來使用物件的特性並操作物件資料,即狀態,而無需真正瞭解類是如何在內部實現的。

例如,您的程式可以呼叫sort()函式,而無需瞭解該函式實際上使用什麼演算法對給定值進行排序。事實上,排序功能的底層實現可能會在庫的不同版本之間發生變化,只要介面保持不變,您的函式呼叫仍然可以工作。

在 C++ 中,我們使用來定義我們自己的抽象資料型別 (ADT)。您可以使用類ostreamcout物件將資料流式傳輸到標準輸出,如下所示:

#include <iostream>
using namespace std;

int main() {
   cout << "Hello C++" <<endl;
   return 0;
}

這裡,您不需要了解cout如何在使用者螢幕上顯示文字。您只需要瞭解公共介面,而“cout”的底層實現可以自由更改。

訪問標籤強制執行抽象

在 C++ 中,我們使用訪問標籤來定義類的抽象介面。一個類可以包含零個或多個訪問標籤:

  • 使用 public 標籤定義的成員可供程式的所有部分訪問。型別的抽象檢視由其公共成員定義。

  • 使用 private 標籤定義的成員無法被使用該類的程式碼訪問。private 部分隱藏了使用該型別的程式碼的實現細節。

訪問標籤出現的次數沒有限制。每個訪問標籤都指定了後續成員定義的訪問級別。指定的訪問級別一直有效,直到遇到下一個訪問標籤或類的主體閉合右括號。

資料抽象的優點

資料抽象提供了兩個重要的優勢:

  • 類內部受到保護,避免使用者級錯誤,這些錯誤可能會破壞物件的狀態。

  • 隨著時間的推移,類實現可以根據不斷變化的需求或錯誤報告進行演變,而無需更改使用者級程式碼。

透過僅在類的 private 部分定義資料成員,類作者可以自由地更改資料。如果實現發生變化,只需要檢查類程式碼即可瞭解更改可能產生的影響。如果資料是 public 的,則任何直接訪問舊錶示形式的資料成員的函式都可能被破壞。

資料抽象示例

任何實現帶有 public 和 private 成員的類的 C++ 程式都是資料抽象的示例。請考慮以下示例:

#include <iostream>
using namespace std;

class Adder {
   public:
      // constructor
      Adder(int i = 0) {
         total = i;
      }
      
      // interface to outside world
      void addNum(int number) {
         total += number;
      }
      
      // interface to outside world
      int getTotal() {
         return total;
      };
      
   private:
      // hidden data from outside world
      int total;
};

int main() {
   Adder a;
   
   a.addNum(10);
   a.addNum(20);
   a.addNum(30);

   cout << "Total " << a.getTotal() <<endl;
   return 0;
}

當以上程式碼被編譯並執行時,它會產生以下結果:

Total 60

以上類將數字加在一起,並返回總和。公共成員 - addNumgetTotal 是面向外部世界的介面,使用者需要了解它們才能使用該類。私有成員total是使用者不需要了解的,但類正常執行需要它。

設計策略

抽象將程式碼分為介面和實現。因此,在設計元件時,必須使介面獨立於實現,以便如果更改底層實現,則介面將保持不變。

在這種情況下,任何使用這些介面的程式都不會受到影響,並且只需要使用最新的實現重新編譯即可。

廣告