给C找对象

给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* 类型和变长参数。
有兴趣可以和我讨论一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值