有人觉得面向对象是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语言里实现“面向对象编程”的更多相关文章

  1. 2018.3.5 Java语言基础与面向对象编程实践

    Java语言基础与面向对象编程实践 第一章 初识Java 1.Java特点 http://www.manew.com/blog-166576-20164.html Java语言面向对象的 Java语言 ...

  2. ndk学习之c++语言基础复习----面向对象编程

    关于面向对象编程对于一个java程序员那是再熟悉不过了,不过对于C++而言相对java还是有很多不同点的,所以全面复习一下. 类 C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程 ...

  3. Go语言基础之面向对象编程中

    1 Golang面向对象编程基本介绍 Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OPP语言不一样,随后分别介绍Golang对面向对象编程的三大特性是如何实现的. 2 ...

  4. 2018.6.20 Java考试试题总结(Java语言基础与面向对象编程)最新版

    Java考试试题总结 一.单选题(每题1分 * 50 = 50分) 1.java程序的执行过程中用到一套JDK工具,其中javac.exe指( B ) A.java语言解释器 B.java字节码编译器 ...

  5. Python之路【第五篇】:面向对象编程

    面向对象编程思维导向图

  6. python中的面向对象编程

    在python中几乎可以完成C++里所有面向对象编程的元素. 继承:python支持多继承: class Derived(base1, base2, base3): pass 多态:python中的所 ...

  7. Python 第六篇(上):面向对象编程初级篇

    面向:过程.函数.对象: 面向过程:根据业务逻辑从上到下写垒代码! 面向过程的编程弊:每次调用的时候都的重写,代码特别长,代码重用性没有,每次增加新功能所有的代码都的修改!那有什么办法解决上面出现的弊 ...

  8. python 面向对象编程(初级篇)

    飞机票 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最 ...

  9. 面向对象编程其实很简单——Python 面向对象(初级篇)

    出处:http://www.cnblogs.com/wupeiqi/ 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函 ...

随机推荐

  1. Educational Codeforces Round 20 D. Magazine Ad

    The main city magazine offers its readers an opportunity to publish their ads. The format of the ad ...

  2. 用CSV库一行行插入数据

    语料团队之前都是手动标注文字的定位位置,今天写了个小脚本,帮他们批量生成文字对应的定位. 其中数据生成后,要生成csv文件,查看了下使用csv库. import csv row1 = [1,2,3,4 ...

  3. JDBC 学习笔记(二)—— 详解 JDBC 的四种驱动类型

    JDBC 有四种驱动类型,分别是: JDBC-ODBC 桥(JDBC-ODBC bridge driver plus ODBC driver) 本地 API 驱动(Native-API partly ...

  4. 项目记事【SpringMVC-2】:将后台的对象,转成JSON报文

    Spring版本:3.2.7 Jackson版本: <!--Jackson --> <dependency> <groupId>com.fasterxml.jack ...

  5. BZOJ3325 [Scoi2013]密码 【manacher】

    题目 Fish是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进.通过翻阅古籍,Fish 得知了这个密码的相关信息: 该密码的长度 ...

  6. hdu 3478 Catch 二分图染色

    题目链接 题意 小偷逃跑,从某个点出发,每下一个时刻能够跑到与当前点相邻的点. 问是否存在某一个时刻,小偷可能在图中的任意一个点出现. 思路 结论 如果该图为连通图且不为二分图,则可能,否则不可能. ...

  7. AC日记——[Sdoi2013]森林 bzoj 3123

    3123: [Sdoi2013]森林 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 3216  Solved: 944[Submit][Status] ...

  8. js -“=”“==”和“===”的区别

    这个问题再面试中经常被问到,说实话我都是懵的,一个“=”和两个“==”等的区别我还是知道的,就是三个“===”我完全是不知道的,因为我基本上都没有遇到过且用到过,所以再这个问题上我是没分的,人家考官就 ...

  9. (3)一般处理程序 ,HttpContext类

    一般处理程序的后缀名 .ashx  ,专门用来处理web请求 新建后默认代码: public class Handler1 : IHttpHandler { public void ProcessRe ...

  10. make makefile cmake qmake都是什么,有什么区别

    原文:https://www.zhihu.com/question/27455963 作者:玟清链接:https://www.zhihu.com/question/27455963/answer/36 ...