给C找对象
背景
N天前,工作室开始招新了。
同事问我:“CHEN,你打算给师弟讲什么内容啊。”
经过了N久的考虑后,“我觉得,要不,就讲编程范式和带他们入门一下JAVA吧?”
于是有了资料和PPT 下载
开始吧
其实C语言并没有类的概念的,但是这不代表就不能写面向对象的东西。
首先,我们想一下,如果我们要用C写对象,用什么东西写最好呢?
答案就是结构体。
C语言除了提供了基本数据类型外,还提供了用户自己定制数据类型的能力,那就是结构体。
你可以用结构体去做一个面向对象的雏形。
比如说一个男朋友的结构体
typedef struct {
double height;//身高
double width;//身宽
} BoyFriend;
没错,这样子就有一个男朋友的结构体有身高、身宽(= =)。
可是他没有动作,就像一个衣服模特架子一样。
因此,是时候给他灵魂了。(有种造人的感觉)
我们把结构体改成
typedef struct {
jdouble height;//身高
jdouble width;//身宽
jstring name;//姓名
Human human;//父类
void(*payUpMoney) ();//付款
void(*thinkQuestion)();//思考问题
} BoyFriend;
动作太大了,一下子就给了太多的东西,你可能懵了,我一点一点说吧。
1. jstring哪里来的
#ifdef __cplusplus
extern "C" {
#endif
typedef int jint;
typedef char jchar;
typedef short jshort;
typedef unsigned char jboolean;
typedef float jfloat;
typedef double jdouble;
typedef char * jstring;//看这里
#ifdef __cplusplus
}
#endif
其实他就是一个char的指针类型,想想Java中的String的构造也差不多。可以看看这篇文章《String和StringBuilder和StringBuffer三兄弟》
至于其他的东西,相信你看了也懂。
2. Human human哪来的
typedef struct {
jstring name;//名字
void(*thinkQuestion) ();//思考问题
} Human;
如果你有一点Java基础,相信你知道我要做什么了,没错,继承。
3. void(*payUpMoney) ();是什么
从字面字义上看,其实就是一个男朋友付款的函数。但是,他最重要的身份是一个函数指针,算是对虚函数的模拟吧。
注入灵魂
BoyFriend getBoyFriend() {
BoyFriend boyFriend;
//设置属性
boyFriend.name = (char *)malloc(sizeof(char)* 20);
//对象
boyFriend.human = getHuman();
//方式
boyFriend.payUpMoney = payUpMoney;
boyFriend.thinkQuestion = thinkQuestion1;//重写的方法
return boyFriend;
}
再来两句
在使用这些构造体类的时候,要注意两点
1. 指针记得赋值,避免称为野指针
2. 记得获得结构体对象
其实写这个例子只是应证:语言不属于任何一种编程范式。
资料
可以下载我的资料辅助理解。毕竟我写的代码给的注释都是很多的。
作业
资料中有一份作业,有兴趣的朋友可以下载。
实现一个可以存放int、float、double、char 型的指针链表,主要操作是存和取。
加分点:使用可变长参数
比如
insert(dataA);//一个参数
insert(dataA,dataB);//两个参数
其实就是使用void* 类型和变长参数。
有兴趣可以和我讨论一下。