C++中的資料封裝



所有C++程式都由以下兩個基本元素組成:

  • 程式語句(程式碼) − 這是程式中執行操作的部分,它們被稱為函式。

  • 程式資料 − 資料是程式的資訊,受程式函式影響。

封裝是一個面向物件程式設計的概念,它將資料和操作資料的函式繫結在一起,並保護兩者免受外部干擾和誤用。資料封裝導致了重要的OOP概念資料隱藏

資料封裝是一種將資料及其使用的函式捆綁在一起的機制,而資料抽象是一種僅公開介面並向用戶隱藏實現細節的機制。

C++透過建立稱為的使用者定義型別來支援封裝和資料隱藏的特性。我們已經學習過,一個類可以包含私有、保護公有成員。預設情況下,在類中定義的所有專案都是私有的。例如:

class Box {
   public:
      double getVolume(void) {
         return length * breadth * height;
      }

   private:
      double length;      // Length of a box
      double breadth;     // Breadth of a box
      double height;      // Height of a box
};

變數 length、breadth 和 height 是私有的。這意味著它們只能被 Box 類的其他成員訪問,而不能被程式的任何其他部分訪問。這是實現封裝的一種方式。

為了使類的部分成員公有(即,可被程式的其他部分訪問),必須在public關鍵字之後宣告它們。在 public 說明符之後定義的所有變數或函式都可以被程式中的所有其他函式訪問。

將一個類設為另一個類的友元會公開實現細節並降低封裝性。理想情況下,應儘可能多地隱藏每個類的細節,使其不被其他類訪問。

資料封裝示例

任何實現具有公有和私有成員的類的 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 是對外部世界隱藏的內容,但類需要它才能正常執行。

設計策略

我們大多數人都學會了預設情況下將類成員設為私有,除非我們確實需要公開它們。這只是良好的封裝

這最常應用於資料成員,但也同樣適用於所有成員,包括虛擬函式。

廣告