C++ 教程 | 4. 抽象与封装
He Junze

抽象与封装是两个重要的程序设计手段,主要是用来 驾驭程序的复杂度 提高程序的安全性 ,便于 大型程序的设计、理解与维护

对于一个程序实体而言,
抽象 是指该程序实体 外部 可观察到的行为,使用者不考虑该程序实体的内部是如何实现的。(复杂度控制)
封装 是指把该程序实体 内部 的具体实现细节对使用者隐藏起来,只对外提供一个接口。(信息保护)

主要的程序抽象与封装机制包括:

  • 过程抽象与封装

    • 数据表示是公开的,缺乏保护
  • 数据抽象与封装

    • 数据的使用者不需要知道数据的具体表现形式,实现了更好的数据保护

过程抽象与封装

实现过程抽象与封装的程序实体通常称为 子程序 。在 C/C++ 语言中,子程序用 函数 来表示。

栈的抽象与封装数据表示:定义栈数据类型

1
2
3
4
5
6
7
8
9
10
11
const int STACK_SIZE=100;
class Stack
{     
public// 对外的接口(外部可使用的内容)
Stack(); // 初始化函数,在声明对象时会自动调用
void push(int e);
void pop(int &e);
private// 隐藏的内容(外部不可使用)
int buffer[STACK_SIZE];
int top;
};

然后再单独书写 push 和 pop 函数、初始化函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/* 详细函数内容编写: */
void Stack::push(int e)
   {    if (top == STACK_SIZE-1
       {    cout << “Stack is overflow.\n”;
           exit(-1);
       }
       else
       {    top++;  buffer[top] = e;
           return;
       }
   }

void Stack::pop(int &e)
   {    if (top == -1
       {    cout << “Stack is empty.\n”;
           exit(-1);
       }
       else 
       {    e = buffer[top]; top--;
           return;
       }
   }
   
Stack::Stack()// 初始化函数,在声明对象时会自动调用
{ top = -1
}

使用该类和方法时:

1
2
3
4
5
6
7
8
9
10
Stack st;  // 会自动地去调用 st.Stack()对 st 进行初始化。
int x;
st.push(12);  // 把 12 放进栈 st
......
st.pop(x);  // 把栈顶元素退栈并存入变量 x
......
st.top = -1;  //Error,不能直接操作 st!
st.top++;  //Error ,不能直接操作 st!
st.buffer[st.top] = 12;  //Error ,不能直接操作 st!
st.f(); //Error,f 不属于能对 st 进行的操作!
 REWARD AUTHOR
 Comments
Comment plugin failed to load
Loading comment plugin