一、从高处看面向对象
1、面向对象是一种编程思想
(1)面向对象并不是C++特有的,所有编程语言都可以面向对象
(2)面向对象语言就是设计语言特性时充分考虑并且原生支持面向对象特征的那些编程语言
(3)面向对象之于编程,就好像比喻修辞法之于写作
(4)面向对象只是编程语言语法层面的东西,不影响最终生成的二进制程序,也不关CPU的事儿
(5)深度装x:面向对象是一种哲学
2、面向对象并不是一个单一概念
(1)面向对象三大特征:封装、继承、多态
(2)面向对象还会延伸出很多细节,而不同编程语言会选择不同的应对方法
(3)C++的语法细节很多,而Java的语法细节少,但都是面向对象的
(4)面向对象是设计模式的基础,凡事从简单到复杂其实学起来顺理成章
3、如何学习面向对象
(1)高屋建瓴,先理解理论和需求,再关注语法细节
(2)要先有一定框架思想,先有一定(写或者至少是读)代码量积累
(3)要从已知到未知,从案例中去领会,才能有真正的感受,才能真正学会
4、本篇文章如何讲面向对象
(1)先提出一个简单问题,譬如单片机或嵌入式编程中最简单的流水灯问题。 ??第一步:用C语言常规方法实现,理解
??第二步:用C语言面向对象方法实现,边分析边讲解边实现,再理解
??第三步:用C++面向对象方式实现,对比第二步,再理解
??第四步:逐一详解面向对象的各特征,并且用C++来实例讲解实现
??第五步(未来自己做):碰到其他语言如Java等,用本篇文章讲的思路结合具体语言语法往进套即可
二、纯C语言传统方式实现流水灯
1、问题描述和分析 (1)假设有2个LED,分别是led1和led2
(2)流水灯延时设置为1s
2、用C语言实现 (1)用printf打印信息表示LED亮灭
(2)用sleep来延时
(3)编写各个LED亮灭的函数
(4)循环形成流水灯效果
#include <stdio.h>
#include <unistd.h>
void led_on(void);
void led_off(void);
void led_on(void)
{
printf("led1 on.\n");
sleep(1);
printf("led2 off.\n");
sleep(1);
}
void led_off(void)
{
printf("led1 off.\n");
sleep(1);
printf("led2 on.\n");
sleep(1);
}
int main(int argc, char *argv[])
{
while(1)
{
led_on();
led_off();
}
return 0;
}
三、升级版纯C实现流水灯
1、使用函数传参简化 (1)设计2个参数,分别是led编码和亮灭编码
2、封装参数为结构体 (1)设计1个结构体类型,包含2个参数
(2)用结构体变量来实现传参
#include <stdio.h>
#include <string.h>
#include <unistd.h>
struct led_control
{
int i;
int j;
};
void led_on_off(int led_n, int ctl)
{
ctl ? printf("led_%d_on\n", led_n) : printf("led_%d_off\n", led_n);
}
void led_ctl(int num)
{
struct led_control lcl;
for (lcl.i = 1; lcl.i < 4; lcl.i++)
{
if (lcl.i == num)
lcl.j = 1;
else
lcl.j = 0;
printf("lcl.i = %d, lcl.j = %d\n", lcl.i, lcl.j);
led_on_off(lcl.i, lcl.j);
}
}
int main(int argc, char *argv[])
{
while(1)
{
led_ctl(1);
sleep(1);
led_ctl(2);
sleep(1);
led_ctl(3);
sleep(1);
}
return 0;
}
3、对比分析 (1)升级版和原始版效果完全一样 (2)升级版对代码量有简化 (3)升级版对编程难度和组织结构性有改善 (4)升级版具备极强的扩展性 (5)问题越复杂,升级版的优势会越显现出来
四、面向对象方式纯C实现流水灯
1、分析 (1)面向对象编程的第1步,是从理念上把你要处理的任务当成一个对象
(2)第2步,将你的“任务完成”分解成“对象”的多个方法(function)的依次完成
(3)第3步,抽象出你的“对象”的模型(类,class)来,用struct来表示,对象的功能方法用函数指针
(4)第4步,方法中需要用到的变量(variable)定义为属性(property),用struct内包含的变量来实现
(5)第5步,实现你的“对象”抽象出的struct的全套数据结构和函数实体
(6)第6步,顺理成章的完成项目。
2、分析和实战 (1)分析出本案的对象“led” (2)分析出对象的方法:led.on, led.off, led.delay (3)抽象出对象的模型:struct led{};
3、编程实现 (1)实现struct led的全部数据结构和方法 (2)用面向对象的思路实现整个程序
#include <stdio.h>
#include <unistd.h>
typedef void (*pfunc_on_t)(void);
struct led
{
int sDelay;
pfunc_on_t von;
void (*voff)(void);
void (*vDelay)(int time);
};
void on(void)
{
printf("led on.\n");
}
void off(void)
{
printf("led off.\n");
}
void Delay(int time)
{
sleep(time);
}
int main(int argc, char*argv[])
{
struct led led1;
struct led led2;
struct led led3;
led1.von = on;
led1.voff = off;
led1.vDelay = Delay;
led2.von = on;
led2.voff = off;
led3.von = on;
led3.voff = off;
while(1)
{
led1.von();
led1.vDelay(1);
led1.voff();
led1.vDelay(1);
led2.von();
sleep(1);
led2.voff();
sleep(1);
led2.von();
sleep(1);
led2.voff();
sleep(1);
}
return 0;
}
5、总结 (1)本案实现并不难,有一定C功底的可以很容易看懂,关键是体会这种思路
(2)函数指针只是手段,并不是关键点
(3)面向对象认为:万物皆是对象,所有操作全是对象的方法,所有变量全是对象的属性。
(4)面向对象和面向过程是共存的,或者说面向对象是基于面向过程的,而不是替代。
五、用C++实现流水灯
1、C++中用struct实现
??和用class一样,将下方代码的typedef class led改为typedef struct led即可。
2、升级用class实现
#include <iostream>
#include <unistd.h>
using namespace std;
typedef class led
{
public:
int index;
void on(void);
void off(void);
}led;
void led::on(void)
{
cout << "led_" << this->index << "on" << endl;
}
void led::off(void)
{
cout << "led_" << this->index << "off" << endl;
}
int main(int argc, char * argv[])
{
led led1;
led led2;
led led3;
led1.index = 1;
led2.index = 2;
led3.index = 3;
while(1)
{
led1.on();
led2.off();
led3 .off();
sleep(1);
led1.off();
led2.on();
led3.off();
sleep(1);
led1.off();
led2.off();
led3.on();
sleep(1);
}
return 0;
}
3、体会C++比C的差异 (1)C++源生支持面向对象的语法特性,所以实现起来舒服一些
(2)目前为止其实感受不到C++比C太大的优势和差别,因为还没用到更多更复杂的特性。
(3)C++最早叫C with class,可以认为C++就是在C的基础上增加了很多面向对象的实现特性。
六、拓展分析和总结
1、Linux中面向对象编程、华为LiteOS中面向对象编程、STM32 HAL库中面向对象编程 ??使用C语言,借助结构体和函数指针来实现面向对象的思想。
2、总结 (1)面向对象是针对面向过程说的,编程时关注对象由“过程”转为“对象”
(2)面向对象的外部表象就是一种组织代码,写程序的方式
(3)面向对象的本质是一种封装数据和看待问题的更高层次的视角
(4)面向对象是应对越来越复杂问题,是处理越来越庞大程序的更有效的方法
(5)语言由非面向对象升级到面向对象是自然而然的成长,和人一样
注:本资料大部分由朱老师物联网大讲堂课程笔记整理而来并且引用了部分他人博客的内容,如有侵权,联系删除!水平有限,如有错误,欢迎各位在评论区交流。
|