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