C语言里用结构体和指针函数实现面向对象思想

转载 2017年01月03日 17:09:57

一、基础研究

观察如下两个程序a.cb.c

A.c

 

B.c

 

 

这两个程序都是要实现在屏幕上第1040列打印一个绿色的字符c

 

这两个程序的数据组织方式是一样的,都是使用结构体,而且对共性和个性的分离的思路也是一样的,都是将共性封装在main函数里,将个性实现在子函数里。但是a.cb.c封装和分离的角度是不一样的,a.c没有将字符和颜色的属性赋值分离出来,而只是将显示功能分离出来,b.c将字符、颜色的赋值和显示功能都分离了出来,用三个子函数实现,并将相对应的函数指针封装到结构体里去。面向对象程序设计的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成,也就是说我们要尽量把功能以子函数的形式实现。所以在这里虽然ab的设计思想是相同的,但是b.c的封装性要比a.c的封装性更好。

再来看下一个程序:

 

现在要在?处添加语句,使程序能够实现功能。

这里ch * a=new ch);的功能应该与ch a;相同,即定义一个struct c型的结构体变量a。但是我们用ch a;是开辟了一个ch大小的空间并把它命名为a,而这里ch * a=?只是对一个指针进行了赋值,我们一般对指针赋值只是把一个地址给它,并没有开辟空间,但是我们要实现ch a;的功能,必须要在这一句里对该地址开辟空间。现在的问题就是:怎么在给指针赋值时开辟内存空间?

我们知道数组在定义时可以开辟空间,但是数组定义需要单独的一句,而这里需要直接作为右值使用,所以这里需要动态地开辟空间。我们最常用的动态内存分配方法就是使用malloc函数,这个函数有一个参数,是要开辟的空间字节数,在这里我们要开辟的空间大小是结构体a的大小,但是我们不知道结构体a的大小,所以我们要用sizeof得出它的大小。用malloc开辟空间后再将其转换成结构体指针赋给a,程序如下:

 

我们之前使用过宏定义,但是在程序中是宏名直接替换掉后面的东西的,而这里宏有参数x,所以它是带参宏定义,它的格式为:#define 宏名(形参表字符串。这里的x就是一个形参。所以我们要在使用时在宏名后面传入实参。

这里的宏名是new,学过java我们会发现java里初始化对象也是使用new,这里的new其实也是实现一个相似的功能。我们可以把结构体ch理解成一个类,用new对它进行实例化,这样就可以实现面向对象的程序设计思想。其实java里实例化对象也是开辟一个内存空间并给这个空间取一个名字即对象名。结构体为什么可以实现类的功能呢?我们知道,类里面可以定义变量、数组、函数,并进行一些操作如赋值、调用函数之类的,只是在java中类里面程序员不能定义和使用指针进行操作。而结构体里面也可以进行定义变量、数组、函数指针等的操作,所以如果我们要用c语言编写具有面向对象思想的程序,我们可以用结构体来实现类似“类”的功能,并用带参宏定义来实现实例化的功能,或者可以直接用malloc函数来实现实例化,只不过这样语句比较重复。

虽然我们可以在c语言里面用这种方法实现面向对象的程序设计,但是这样毕竟不如用java之类的比较适合面向对象的语言来写有面向对象思想的程序。因为java的类里可以进行赋值、调用函数等功能而c里的结构体不能。java取消了程序员使用指针的权限,因为如果在这种高度封装的语言里使用指针很可能造成很多错误。

从这里看,面向对象和面向过程程序设计思想的区别在哪里呢?面向对象的程序可能需要更多的封装,它的每一个对象都是为执行特定的功能而封装的,对象与对象之间相对比较独立,关系清晰,便于程序的功能细化、管理维护,但是也会造成程序的代码量增大。面向过程的程序封装的主要是一些数据结构,一个函数、变量可以被以多种角度来使用,这样使程序变得十分精简短小,但是不容易修改和补充。

我们写程序是用来解决问题的,而且要解决的是现实中的问题,所以我们需要将现实问题转化为符号化的问题,而现实中的问题是由个体所组成的,所以我们将数据和处理数据的方法封装起来形成一个个体,这个个体在问题里面有专门的功能,比如一张纸可以折叠,一支笔可以写,这样有助于我们以自身的角度进行思考分析,这就是面向对象。如果用面向过程的思路,会导致问题与程序之间的转化不好处理,可能使解决问题出现偏差。

szsleep.com/mrqhr
szsleep.com/riulc
szsleep.com/uiumd
szsleep.com/ifdne
szsleep.com/waovm
szsleep.com/hhljt
szsleep.com/faopg
szsleep.com/qstgh
szsleep.com/bhuqd
szsleep.com/rejkx
szsleep.com/exdey
szsleep.com/urntu
szsleep.com/cghuv
szsleep.com/osabo
szsleep.com/fuqfz
szsleep.com/diopc
szsleep.com/lsoiv
szsleep.com/mqyzm
szsleep.com/flaiv
szsleep.com/hsfgt
szsleep.com/dzabo
szsleep.com/rtbcp
szsleep.com/sgopc
szsleep.com/zbhuo
szsleep.com/dzokx
szsleep.com/11116
szsleep.com/61666
szsleep.com/11111
szsleep.com/11661
szsleep.com/16166

相关文章推荐

将十进制数/字符串转换为BCD码(将字符存入内存)

原文地址::http://www.kaixinwenda.com/article-MPowell-8657770.html     需求:将十进制数按字面数值直接存入内容,如int nDec=1...

16进制 10进制 BCD码之间的转换

#include #include ///////////////////////////////////////////////////// // //功能:二进制取反 // /...

C语言中的结构体与面向对象编程思想

没有万能的编程技术 没有只产生正确的结果的编程语言 不是每个项目的编程都是从零开始的 —-Object-Oriented Programming With ANSI-C 一、C语言结...

结构体,面向对象的基础----小话c语言(11)

[Mac-10.7.1  Lion  Intel-based  x64  gcc4.2.1] Q: 结构体的本质是什么? A: 结构体就像一种粘合剂,将事物之间的关系很好地组合在了一起。 ...

c语言结构体模拟c++对象的方法,并实现this指针

先说一下结构体模拟对象的基本思路。 1. 在结构体里定义好函数指针。 2. 在结构体外面定义好对象的方法。 3. 在结构体初始化的时候把这些方法的地址赋值给对应的函数指针。 4. 通过函数指针...
  • jsc723
  • jsc723
  • 2016年12月16日 14:17
  • 977

C++小课堂--第一期---面向对象之前 --- 实现函数返回结构体,实现大数据的传输

即将开启C++学习之旅,是时候该说些什么了; 好了话不多说,上代码: #include using namespace std; struct course{ double math; ...

C语言开发函数库时利用不透明指针对外隐藏结构体细节

1 模块化设计要求库接口隐藏实现细节作为一个函数库来说,尽力减少和其调用方的耦合,是最基本的设计标准。C语言,作为经典“程序=数据结构+算法”的践行者,在实现函数库的时候,必然存在大量的结构体定义,接...
  • smstong
  • smstong
  • 2016年02月21日 12:15
  • 3563

C语言函数指针,结构体阶段总结

1.数组与函数 1)        数组元素作参数 large(int x, int y){...}; large(a[2], a[3]);   2)        数组名作参数 计算...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言里用结构体和指针函数实现面向对象思想
举报原因:
原因补充:

(最多只允许输入30个字)