怎样在C语言里实现“面向对象编程”
有人觉得面向对象是C++/Java这样的高级语言的专利,实际不是这样。面向对象作为一种设计方法。是不限制语言的。仅仅能说,用C++/Java这样的语法来实现面向对象会更easy、更自然一些。
在本节中。就展示怎样在C语言中实现面向对象编程。这是一件吃力的工作。写这些的目的有两个:
① 更好的掌握C++中的class的概念。
学习了本章,就知道C程序猿的无耐。就知道为什么要发明一个class的概念、为什么要有成员函数等等。
② 为C程序猿提供一个參考设计。由在存在某些场合。仅仅同意用C语言来编程,不同意用C++来编程。
这时候,能够參考本篇的代码,用C的语法来模拟C++的类来实现面向对象编程。
本篇按从易到难的顺序,提供几种基于C struct的面向对象的写法。在本节的展示中,统一以.c后缀命名文件,也就是说。是以C语言的语法来书写代码。C语言和C++的struct写法略有差别,请參考附录《C++与C的差别》。
权利声明:作者拥有本书的所有权利。
作者授权不论什么人都能够自由转载本站点发布的内容,但转载时必须遵守下面限制: ①转载时必须全文转载。不得有不论什么改动,必须包括“权利声明”和“官网地址” ② 仅限于网络转载,即终于结果发布于网络上。凡是不遵守以上两条的转载行为视为侵权行为。除非本人同意,不论什么人不得将本站点内容内容用于不论什么的其它用途。
官网地址: http://www.afanihao.cn/ 留言请到http://www.afanihao.cn/kbase/
1.1 第1种方法
这样的方法仅仅适合单一实例的对象。
以打印机Print对象为例,系统中仅仅存在一台打印机。此时按下面方法提供接口,
首先。给出printer.h,里面写明对外的接口。
/////////////////// printer.h begin ///////////////
#ifndef _PRINTER_H
#define _PRINTER_H
int pr_open(); // 打开打印机
void pr_close(); // 关闭打印机
void pr_print(const char* text); // 打印文本
#endif
/////////////////////////////////////////////////////
其次,给出printer.c,给出函数接口的实现。
因为没有办法操纵一台真实的打印机。那样代码太复杂,作者不easy理解。所以这里使用“虚拟打印机”的概念。所谓“打印”,仅仅是将文件写到指定的文件c:\printer.txt里,
/////////////////// printer.c ///////////////
#include <stdio.h>
#include "printer.h"
// 定义
typedef struct
{
FILE* outfile;
}printer_t;
// 定义唯一实例
static printer_t pr = { NULL };
// 打开打印机
int pr_open()
{
pr.outfile = fopen("c:/printer.txt", "ab");
if(pr.outfile == NULL)
return -1;
return 0;
}
// 关闭打印机
void pr_close()
{
if(pr.outfile)
{
fclose(pr.outfile);
pr.outfile = NULL;
}
}
// 打印文本
void pr_print(const char* text)
{
fprintf(pr.outfile, text);
}
/////////////////// ///////////////
在main.c中这么调用
/////////////////// main.c ///////////////
#include "printer.h"
void main()
{
pr_open(); // 打开
pr_print("aaabbbccc\n"); // 输出文本
pr_close(); // 关闭
}
能够总结出这样的写法的特点:
(1) 尽管是面向对象。但仅仅有一个对象。该对象外部不可见;
(2) 外界仅仅能通过函数接口该对象的功能。能够发现,函数中并没有传入对象的指针。
1.2 第2种方法
当能够创建多个对象时。使用此种方法来实现。仍然前面的printer为例,事实上这个printer仅仅是一个“虚拟”的打印机。终于目标是输出到一个本地的文件。那么,能够同意创建多个printer对象的。
头文件printer.h中定义对象,在提供的接口函数都有对象指针,当中~open函数用于创建一个对象,~close用于销毁对象。
///////////////////printer.h ///////////////
#ifndef _PRINTER_H
#define _PRINTER_H
#include <stdio.h>
typedef struct
{
FILE* outfile;
}printer_t;
printer_t* pr_open(const char* filename); // 打开打印机
void pr_close(printer_t* pr); // 关闭打印机
void pr_print(printer_t* pr, const char* text); // 打印文本
#endif
以下是它的实现,
///////////////////printer.c ///////////////
#include <stdio.h>
#include <stdlib.h>
#include "printer.h"
// 打开打印机
printer_t* pr_open(const char* filename)
{
printer_t* pr = (printer_t*)malloc(sizeof(printer_t));
pr->outfile = fopen(filename, "ab");
if(!pr->outfile)
{
free(pr);
return NULL;
}
return pr;
}
// 关闭打印机
void pr_close(printer_t* pr)
{
fclose(pr->outfile);
free(pr);
}
// 打印文本
void pr_print(printer_t* pr, const char* text)
{
fprintf(pr->outfile, text);
}
在main.c的调用这个对象。
///////////////////main.c ///////////////
#include "printer.h"
void main()
{
printer_t* pr = pr_open("c:/1.txt");
pr_print(pr, "aaabbbccc\n");
pr_close(pr);
}
至此,面向对象已经比較完整,它有3个要素:
① 对象的创建:使用pr_open函数来创建一个对象,同意创建多个对象。
② 对象的销毁: 使用pr_close来销毁对象
③ 对象的功能接口: pr_print是其功能接口,注意这个函数的第一个參数就是指向了一个对象
1.3 第3种方法
这样的方法是对方法2的升级。理念和方法2一样。
它是在形式上和C++的class基本一致,也许能够说,C++的class是从这样的方法演化而来的。
。。
。本节内容不公开,很多其它内容请购买纸质教材。谢谢支持!。。。
怎样在C语言里实现“面向对象编程”的更多相关文章
- 2018.3.5 Java语言基础与面向对象编程实践
Java语言基础与面向对象编程实践 第一章 初识Java 1.Java特点 http://www.manew.com/blog-166576-20164.html Java语言面向对象的 Java语言 ...
- ndk学习之c++语言基础复习----面向对象编程
关于面向对象编程对于一个java程序员那是再熟悉不过了,不过对于C++而言相对java还是有很多不同点的,所以全面复习一下. 类 C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程 ...
- Go语言基础之面向对象编程中
1 Golang面向对象编程基本介绍 Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OPP语言不一样,随后分别介绍Golang对面向对象编程的三大特性是如何实现的. 2 ...
- 2018.6.20 Java考试试题总结(Java语言基础与面向对象编程)最新版
Java考试试题总结 一.单选题(每题1分 * 50 = 50分) 1.java程序的执行过程中用到一套JDK工具,其中javac.exe指( B ) A.java语言解释器 B.java字节码编译器 ...
- Python之路【第五篇】:面向对象编程
面向对象编程思维导向图
- python中的面向对象编程
在python中几乎可以完成C++里所有面向对象编程的元素. 继承:python支持多继承: class Derived(base1, base2, base3): pass 多态:python中的所 ...
- Python 第六篇(上):面向对象编程初级篇
面向:过程.函数.对象: 面向过程:根据业务逻辑从上到下写垒代码! 面向过程的编程弊:每次调用的时候都的重写,代码特别长,代码重用性没有,每次增加新功能所有的代码都的修改!那有什么办法解决上面出现的弊 ...
- python 面向对象编程(初级篇)
飞机票 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最 ...
- 面向对象编程其实很简单——Python 面向对象(初级篇)
出处:http://www.cnblogs.com/wupeiqi/ 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函 ...
随机推荐
- 九度oj 题目1457:非常可乐
题目描述: 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样 ...
- activemq的安装启动
Activemq安装和启动 官网:http://activemq.apache.org/ 安装启动: $ tar -zxvf apache-activemq-5.11.1-bin.tar.gz ...
- Java接口抽象类
抽象类中的方法可以实现,接口中的方法只能声明,不能实现.抽象类的成员变量可以为各种类型,接口的变量只能为public static final.抽象类可以有静态方法和静态代码块,接口不能有.一个类只能 ...
- Linux Shell系列教程
学习Linux Shell知识,就来Linux大学网(Linuxdaxue.com)! 本系列适合Linux初学者,属于Linux入门级教程,主要介绍了Shell的分类.语法格式以及脚本的使用和编写格 ...
- Linux Shell系列教程之(二)第一个Shell脚本
本文是Linux Shell系列教程的第(二)篇,更多shell教程请看:Linux Shell系列教程 通过上一篇教程的学习,相信大家已经能够对shell建立起一个大体的印象了,接下来,我们通过一个 ...
- 基于 K8S 构建数据中心操作系统
在 12 月 22 日 ECUG 的下午场 ,七牛云容器计算部技术总监袁晓沛为大家带来了主题为<基于 K8S 的 DCOS 之路>的精彩分享,向大家介绍了七牛容器云目前 K8S 的状况和产 ...
- [HNOI2006]公路修建问题 (二分答案,并查集)
题目链接 Solution 二分答案+并查集. 由于考虑到是要求花费的最小值,直接考虑到二分. 然后对于每一个二分出来的答案,模拟 \(Kruskal\) 的过程再做一遍连边. 同时用并查集维护联通块 ...
- C++ 回调函数的简单例子(转)
原文转自 http://blog.csdn.net/wnlwcg/article/details/6930990# 1.调用端 // 下面的这个_stdcall很重要的 void _stdcall T ...
- 转 使用putty从linux主机上面往windows主机下面拷贝文件
更新一下,把putty的包解压以后,想要在dos窗口中直接使用,必须把putty解压的文件的路径添加到环境变量中,这样使用起来就会非常简单了. 郁闷了好久,终于搞定了putty的上传下载文件命令psc ...
- Git基础篇【转】
转自:https://i.cnblogs.com/EditPosts.aspx?opt=1 1.设置名字与邮箱 $ Git config –global user.name “YourName” $ ...