有人觉得面向对象是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. 【bzoj3170】[Tjoi 2013]松鼠聚会 旋转坐标系

    题目描述 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. 输入 ...

  2. POJ——1611The Suspects(启发式并查集+邻接表)

    The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 31100 Accepted: 15110 Descri ...

  3. iOS-Http : GET : POST

    一.概述 * HTTP/1.1协议共定义了8中请求方法:OPTIONS, HEAD, GET, POST, PUT, DELETE, TRACE, CONNECT. * GET方法和POST是我们使用 ...

  4. C语言扩展题

    1.使用cmake来创建c语言工程 2.使用gcc来编译源代码 3.下载redis,并且编译运行redis(注:redis目前是c语言编写的,而且是主要是linux平台,在windows平台编译比较麻 ...

  5. 【NOIP2015】信息传递(强连通分量)

    题意:找一张图中的最小环 O(n) 思路:强连通分量tarjan即可 注意环中节点数>1 ..]of longint; n,i,ans,tot,id,top,time,x:longint; pr ...

  6. Error querying database找不到数据库的错误可能发生的原因..

    这个问题纠结了大概两个小时.原因是这样的,我刚刚换了一台新的电脑,准备把以前电脑上自己搭建的小项目放到新电脑上面,用myeclipse引入项目之后,启动项目在浏览器跑起来.然后输入账号密码登录主页,报 ...

  7. C语言集锦(一) C代码生成图片:BMP、PNG和JPEG

    1.生成BMP图片 在学习图形图像的过程中,最简单和常见的格式是BMP和PPM.下面将给出生成BMP的极度精简代码,然后讲解BMP格式. #include <stdio.h> #inclu ...

  8. HYSBZ 1026: windy数(数位DP)

    类型:数位DP题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数.问[A,B]之间windy数的个数.(1 <= A <= B <= 2000000000 ) 思路 ...

  9. js-浅显基础-正则表达式集

    今天进博客园,忽然发现我也是有粉丝的人啦!!!!!!!!谢谢谢谢关注(爱心爱心) 本来不想做这个笔记的,但是每次都百度我自己都烦死了,所以还是自己整理一下方便我后期使用: 独笑笑不如众笑笑,放轻松点 ...

  10. indexOf()、includes()、startsWith()、endsWith()

    是否包含字符串三种新方法 传统上,JavaScript只有 indexOf 方法,可以用来确定一个字符串是否包含在另一个字符串中.ES6又提供了三种新方法. includes():返回布尔值,表示是否 ...