C语言面向对象的实现---封装性
来源:互联网 发布:淘宝网运动女装夏装 编辑:程序博客网 时间:2024/06/05 06:45
在嵌入式系统开发中,不同的硬件一般都支持C编译器,而可能没有C++的编译器或支持的不好,所以,在嵌入式系统的开发中,C语言是使用最多的语言。而为了使用面向对象(OO)的优点,一般在C编程中加入OO的特性。
面向对象编程(OOP)有三个特性:封装、继承和多态性。Smalltalk、C++、Java、C#等面向对象语言在语言层次上支持OOP,而OOP并不是为特殊语言而使用的,用C和汇编也可以实现OOP的思想。
以下用C实现了OOP的三个特性之一:封装性,也即访问权限。
1. public访问权限(全局权限)---全局可见
关键:只要包含头,该头中声明的成员(属性、方法和宏)就是全局可见的。
如下图,A.h中的声明了v1和f1(), A.c中实现了方法f1(), App.c因为包含了A.h, 所以,在App.c中,v1和f1()都是可见的。
图1.public成员定义
2.protected访问权限(保护权限)---包内可见,包外继承中也可见
只在继承中可以使用的成员,在C中很难实现这种权限。一般用宏定义为public的形式,但在使用中要注意,只让这个成员在继承的类实例中使用(关于C的继承性在其它博文中)。
3.friendly访问权限(包内权限)---只在包内可见,包外不可见
概念:包含其它头的头我们叫它父头,如module1_pkg.h;而被包含的头我们叫它子头,如module1.h。
关键:(1)用多级包含的头文件,形成不同的包内包外访问权限,则父头的声明的成员为friendly访问权限。
(2)包内所有定义.c文件时都使用父头,而在包外使用子头,则父头中声明的成员(属性、方法和宏)在包内可见,而包外不同见。
module1目录就是一个包,其中有一个包头文件module1_pkg.h, 和所有.c文件。包头文件module1_pkg.h包含头文件module1.h,在包头module1_pkg.h是声明的成员---也就是friendly成员。
本包中所有.c文件使用包头module1.pkg.h,而其它包中的所有.c实现文件使用module1.h,则module1_pkg.h中声明的成员在module1包内可见,而在module2包中不可见,如图3.1。
也可以把成员定义在一个.c文件中,再用extern引用提升到module1_pkg.h中,则该成员在包含module1_pkg.h的其它.c文件中可见,而在包含module1.h的其它.c文件中不可见,如图3.2。
图3.1 直接定义的friendly变量和方法 图3.2 使用extern的friendly变量和方法
4. private访问权限(私有权限)---只在本.c文件内可见,其它位置不可见
关键:只在.c文件定义的成员(属性和方法),只能在本.c文件中可见,一般前边加一个static修饰(不加也一样),但为了与用extern修饰而被提升的成员进行区别,所以private成员前加static, 而被提升的成员不加static。
如下图,v2,f2是在A.c中声明和实现的,它们只能A.c中可见,在App.c中不可见。
图4. private成员定义
关键:extern修饰符并不是声明一个成员(属性和方法),只是个引用,并可以提升成员的访问权限。若采用分层的头结构,可以用extern提升成员为包内可见或全局可见。
一般把逻辑上相关的成员声明放在相近的位置,如放在A.c文件中,当要提升成员的访问权限时,可以在.h头中用extern来提升成员的访问权限。
用extern可以把private成员变成public成员;有时只是说明本文件中会用到某个成员(其它文件中已经声明的)而引用一下。
图5.extern的作用
转载:http://hi.baidu.com/hyper99/blog/item/c18b543dcbc8d8f83d6d978c.html
- C语言面向对象的实现---封装性
- C语言面向对象的实现---封装性
- 面向对象之继承,封装,多态c语言实现
- 用C语言实现面向对象之封装
- C语言实现面向对象的思想(实现封装、继承和多态)
- 用c语言实现面向对象的封装继承和多态
- luajit利用ffi结合C语言实现面向对象的封装库
- C语言面向对象的实现
- C语言面向对象的实现---多态性
- C语言实现面向对象的思想
- Objective-c语言_面向对象(封装)
- Objective-C语言_面向对象(封装)
- C语言面向对象的实现---继承性
- C语言面向对象的实现---继承性
- C语言面向对象的实现---继承性
- C语言也可以“面向对象”—— C语言实现封装、继承和多态
- c语言实现面向对象
- C语言实现面向对象
- linux教程:如何用iptables实现NAT
- python多线程模块threadpool简单使用
- 细说shell编程
- C语言文件操作 简单的文件读写加外部调用
- 浅谈SMC技术,值得路过
- C语言面向对象的实现---封装性
- 配置YUM本地源仓库
- phpunit 自动化测试
- 【Android】之【对话框(Dialog)大全】
- 一周最新示例代码回顾 (6/11 - 6/17)
- 自动化组件测试
- oracle分析函数系列之Top/Bottom N、min() keep First/Last、NTile:排名空处理,查询第一名,最后一名
- linux-Tcp IP协议栈源码阅读笔记
- C语言面向对象的实现---继承性