C++ 封装

  • 封装

    所有C++程序均由以下两个基本元素组成-
    • 程序语句(代码) - 这是执行动作的程序的一部分,它们称为功能。
    • 程序数据 - 数据是受程序功能影响的程序信息。
    封装是一种面向对象的编程概念,它将数据与操纵数据的功能绑定在一起,并确保不受外界干扰和滥用。数据封装导致了重要的OOP概念:数据隐藏。数据封装是捆绑数据的机制,使用它们的功能和数据抽象是仅公开接口并向用户隐藏实现细节的机制。 C++通过创建称为类的用户定义类型来支持封装和数据隐藏的属性。我们已经研究过,一个类可以包含private,protected成员和public成员。默认情况下,类中定义的所有项目都是private的。例如-
    
    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是private的。这意味着它们只能由Box类的其他成员访问,而不能由程序的任何其他部分访问。这是实现封装的一种方式。要使类的各个部分公开(即,程序的其他部分可以访问),则必须在public关键字之后声明它们。程序中的所有其他函数都可以访问在public说明符之后定义的所有变量或函数。使一个类成为另一个类的friend可以暴露实现细节并减少封装。理想的做法是使每个类的尽可能多的细节对所有其他类都隐藏。
  • 数据封装示例

    在其中使用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
    
    上一类将数字相加,然后返回总和。公共成员addNum和getTotal是与外界的接口,用户需要了解它们才能使用该类。私人成员总数是对外界隐藏的东西,但对于班级正常运转是必需的。
    我们大多数人已经学会了默认情况下将类成员设为私有,除非我们确实需要公开它们。那只是很好的封装。这最常应用于数据成员,但同样适用于所有成员,包括虚拟函数。