关闭

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

发表于:2016-12-28 10:07

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:风移    来源:51Testing软件测试网采编

  一、基础研究
  观察如下两个程序 a.c 和 b.c :
  A.c :
  B.c :
  这两个程序都是要实现在屏幕上第 10 行 40 列打印一个绿色的字符 c :
  这两个程序的数据组织方式是一样的,都是使用结构体,而且对共性和个性的分离的思路也是一样的,都是将共性封装在 main 函数里,将个性实现在子函数里。但是 a.c 和 b.c 封装和分离的角度是不一样的, a.c 没有将字符和颜色的属性赋值分离出来,而只是将显示功能分离出来, b.c 将字符、颜色的赋值和显示功能都分离了出来,用三个子函数实现,并将相对应的函数指针封装到结构体里去。面向对象程序设计的一条基本原则是 计算机程序是由单个能够起到子程序作用的单元或对象组合而成,也就是说我们要尽量把功能以子函数的形式实现。所以在这里虽然 a 和 b 的设计思想是相同的,但是 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 函数来实现实例化,只不过这样语句比较重复。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号