C语言等面向过程编程中,数据以及数据的相关操作函数都是分离的独立个体;在C++等面向对象编程中,数据以及数据的相关操作被设计为对象,对象包括属性(数据)和操作(函数),两者共同构成对象实体(即类实体)。面向对象编程使程序更模块化,更易读易写,提升了代码重用到一个更高的层次。
面向对象编程中,数据和数据的操作封装为了对象。封装可以隐藏实现细节,使得代码模块化,是把过程和数据包围起来,对数据的访问只能通过已定义的接口。
封装是一种对外提供服务的模型,封装模型是对世间万物的个体抽象。
封装的访问属性如下:
访问属性 属性 对象内部 对象外部
public 公有 可访问 可访问
protected 保护 可访问 不可访问
private 私有 可访问 不可访问
C语言中,struct中所有行为和属性都是public的(默认),既可以使用接口,又可以直接访问其内部数据,没有屏蔽内部数据。C++中的class可以指定行为和属性的访问方式,对内开放数据,对外屏蔽数据,对外提供接口。
stack的C语言实现:
#include <stdio.h>
#include <string.h>
typedef struct stack
{
char space[1024];
int top;
}stack;
void stack_init(stack *st)
{
st->top = 0;
memset(&st->space, 0, sizeof(st->space));
}
int is_empty(stack *st)
{
return st->top == 0;
}
int is_full(stack *st)
{
return st->top == 1024;
}
char pop(stack *st)
{
return st->space[--st->top];
}
void push(stack *st, char c)
{
st->space[st->top++] = c;
}
int main(void)
{
stack st;
stack_init(&st);
unsigned int i;
for(i = ‘a‘; i < (‘z‘ + 1); i++)
{
if(!is_full(&st))
push(&st, i);
}
for(i = ‘a‘; i < (‘z‘ + 1); i++)
{
printf("%c\n", pop(&st));
}
return 0;
}C语言中封装的struct的数据成员是可以被外部调用修改的。
C++类实现stack:
stack.h源码:
#ifndef STACK_H
#define STACK_H
class stack
{
public:
stack();
bool is_empty();
bool is_full();
void push(char c);
char pop();
private:
char space[1024];
unsigned int top;
};
#endif // STACK_H
stack.cpp源码:
#include "stack.h"
#include <string.h>
stack::stack()
{
top = 0;
memset(space, 0, sizeof(space));
}
bool stack::is_empty()
{
return top == 0;
}
bool stack::is_full()
{
return top == 1024;
}
void stack::push(char c)
{
space[top++] = c;
}
char stack::pop()
{
return space[--top];
}
main.cpp源码:
#include <iostream>
#include "stack.h"
#include <string.h>
using namespace std;
int main()
{
stack st;
unsigned int i;
for(i = ‘a‘; i < ‘z‘ + 1; i++)
{
if(!st.is_full())
st.push(i);
}
for(i = ‘a‘; i < ‘z‘ + 1; i++)
{
cout<<st.pop()<<endl;
}
return 0;
}C++语言中封装的class stack中数据成员是private的,对于外部不可访问,通过设置数据成员和操作方法的访问权限,可以对外部开放、屏蔽数据成员和操作方法。
本文出自 “生命不息,奋斗不止” 博客,转载请与作者联系!
嵌入式linux C++语言(三)——封装(Encapsulation)
原文地址:http://9291927.blog.51cto.com/9281927/1837984