解释区分一下C语言和OOP

我们经常说C语言是面向过程的,而C++是面向对象的,然而何为面向对象,什么又是面向过程呢?不管怎么样,我们最原始的目标只有一个就是实现我们所需要的功能,从这一点说它们是殊途同归的。过程与对象只是侧重点不同而已。

举个例子吧,我现在有个计划,要去北京,OOP语言是直接给你一个车,然后你自己设定路线去北京就好,而C语言是需要你自己制造零件,自己组装好车,然后再自己设定路线,最后到达北京。C语言比较费劲,但是程序的效率很高。

过程&对象?

一个对象就是由或多或少的针对这个对象的过程构成的,当然其中是少不了必要的属性。

一个过程是针对一个或者是多个对象所进行的操作。两者是可以互相转换的,关键是哪一种方式更能适合你现在的需求,更能让你的软件开发锦上添花。

 

我个人认为一般情况下,一个更容易扩展、维护的软件通常采用的是OOP的思想,添加一个原本不存在的相对无关单独的个体,总比在一个已经存在的过程内硬塞进去一个对象要简单;而且面向过程更容易导致混乱的维护。

举个例子,同样是一条河与一个湖泊,哪一个更容管理维护呢?我想答案是显而易见的。当然不管怎么样,软件本身设计架构的好坏也是非常重要的。

C语言的特性,实现OOP

C是一门面向过程的语言,但它依旧可以实现大多数面向对象所能完成的工作。比如面向对象的三大特性:封装、继承、多态。我们以下图来写代码举例子。

 

封装

由于面象向对象是将数据与方法封装到一个类里。使用者无需关心类是怎么实现的。在 C_OOP 中贯彻了这一思想,C中有一种复杂的数据结构叫做struct。struct是C里面的结构体。

如上图假如我们要对鸟bird进行封装,bird可能包括姓名、颜色、栖息地、重量、属性等信息。我们就可以对它封装如下:

struct Bird{

char name[20];//姓名

char color;    //颜色

char addr[30];    //栖息地

int weight;        //体重

int other;      //属性

};

当我们要像OOP那样新建一个对象时,我们就可以:

struct Bird p;

我们就可以直接对p进行赋值:

p.name = "bird";

p.color = 'b';  //'b' = black; 'g' = green

p.addr = 'w';

p.weight = 175;

p.other = 1;

继承

在常见用C语言实现继承的机制中,多半是用结构体组合实现的,同样利用struct,我们来创建一个Bird结构,同时继承结构体Bird,如下:

struct fBird{

struct Bird p;

char fly[20]; //飞翔

int scream;        //鸣叫

};

对Bird进行创建对象,并赋值:

struct fBird s;

s.p.name = "bird";

s.p.color = 'b';

s.p.other = 25;

s.p.weight = 65;

s.fly = "0618";

s.scream = 90;

多态

C_OOP中的一个核心就是多态,C中对于多态的实现可以借助函数指针来实现。为了简单起见,我们假设Bird这个结构体中,只有一个函数指针。

struct Bird{

void (*print)(void *p);

};

struct fBird{

struct Bird p;

};

而Bird和fBird这两个结构体的print函数实现如下:

void printBird(void *Bird){

if(NULL == Bird)

return ;

struct Bird *p = (struct Bird *)Bird;

printf("run in the Bird!!\n");

}

void printfBird(void *Bird){

if(NULL == Bird)

return ;

struct Bird *p = (struct Bird *)Bird;

printf("run in the fBird!!\n");

}

我们写一个函数来调用他们:

void print(void *Bird){

if(NULL == Bird)

return ;

struct Bird *p = (struct Bird *)Bird;

p->print(Bird);

}

int main(){

struct Bird bird;

struct fBird fbird;

Bird.print = printBird;

fBird.p.print = printfBird;

print(&bird);    //实参为Bird的对象

print(&fbird);  //实参为fBird的对象

return 0;

}

他们的输出为:

run in the Bird!!

run in the fBird!!

其实这个也不难理解,无论是fBird还是Bird,他们在内存中只有一个变量,就是那个函数指针,而void表示任何类型的指针,当我们将它强制转换成struct Bird类型时,p->print指向的自然就是传入实参的print地址。


学计算机不易,此路应携手前行。

如果你也想学计算机编程的话!

可以来我的C/C++编程学习基地,【点击进入】

还有免费(零基础教程,项目实战教学视频)!

涉及:游戏开发、课程设计、常用软件开发、编程基础知识、黑客等等...

和志同道合的小伙伴们一起学编程吧!

在这里你能学习你想要的,资源、视频、素材、C语言笔记、一个宝藏小编正在等待你的发掘!

 

 

OOP真的那么重要?

从大学到工作至今,在嵌入式领域中一直是使用C语言,而我在学习C++的过程中,看的代码越多,代码量越大,越来越觉得C++对于大型软件架构的良好可控性,和对以后程序员维护代码时良好的可读性;

个人认为:C语言中最大的成功在于它的指针,但是也是最容易出错的,想要理解C,必须要掌握指针。虽然说,语言只是一门工具,但是这是基础.

 

或者你可以说C太底层,现在都是OOP的时代了,谁还会用面向过程的,你们不要忘了操作系统是用什么写的?是C;C实现的nginx的并发量是C++实现的apache的几十倍,关键是要理解语言背后的思想。

当然这不是为了OOP而OOP,实在是OOP的一些特征,例如封装,多态其实是软件工程思想,这些思想不分语言,遵循了这些思想可以使得程序更有弹性,更易修改和维护,避免僵化,脆弱的性质。

嵌入式C语言使用OOP的一些思考

然而就目前来说,在嵌入式领域广泛的使用C++显然是不现实的事情。在一个到处是OOP的年代,为何面向过程的C语言依然可以如此活跃?

我们可以用它来开发一系列的小工具,Unix/Linux就是由这些小工具组成的操作系统;同时用C语言可以开发高性能的应用程序。

C语言良好的可移植性,小巧灵活,而且还有一个直接与硬件打交道的指针的存在,对内存等良好的操作性以及执行之速度快,是嵌入式开发唯有的高级语言,均是一般嵌入式产品的不二首选。

总结

语言只是一种工具,任何语言之间都是相通的,一通则百通,关键是要理解语言背后的思想,理解其思想,任何语言,拿来用就行了。语言没有好坏之分,任何语言既然存在自然有它存在的价值。

真的可以啊,用C语言实现面向对象编程O O P!C语言真的无所不能~的更多相关文章

  1. C 语言实现面向对象编程

    转载 https://blog.csdn.net/onlyshi/article/details/81672279 C 语言实现面向对象编程1.引言面向对象编程(OOP)并不是一种特定的语言或者工具, ...

  2. 一步步分析:C语言如何面向对象编程

    这是道哥的第009篇原创 一.前言 在嵌入式开发中,C/C++语言是使用最普及的,在C++11版本之前,它们的语法是比较相似的,只不过C++提供了面向对象的编程方式. 虽然C++语言是从C语言发展而来 ...

  3. 基于C语言的面向对象编程

    嵌入式软件开发中,虽然很多的开发工具已经支持C++的开发,但是因为有时考虑运行效率和编程习惯,还是有很多人喜欢用C来开发嵌入式软件.Miro Samek说:"我在开发现场发现,很多嵌入式软件 ...

  4. 真的可以,用C语言实现面向对象编程OOP

    ID:技术让梦想更伟大 作者:李肖遥 解释区分一下C语言和OOP 我们经常说C语言是面向过程的,而C++是面向对象的,然而何为面向对象,什么又是面向过程呢?不管怎么样,我们最原始的目标只有一个就是实现 ...

  5. Python源代码 -- C语言实现面向对象编程(基类&派生类&多态)

    背景 python是面向对象的解释性语言.然而python是通过C语言实现的,C语言怎么跟面向对象扯上了关系? C语言能够实现面向对象的性质? 原文链接:http://blog.csdn.net/or ...

  6. Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量

    1 第一个OC控制台程序 1.1 问题 Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序.其运行于苹果公司的Mac操作系统下. 本案例要求使用集成 ...

  7. C语言进行面向对象编程

    http://blog.csdn.net/dadalan/article/details/3983888 http://blog.163.com/zhqh43@126/blog/static/4043 ...

  8. c语言实现面向对象编程

    1.通用校验器接口(validator.h) #ifndef VALIDATOR_H_INCLUDED #define VALIDATOR_H_INCLUDED #include<stdbool ...

  9. 用C语言实现面向对象的开发

    C语言的对象化模型 面向对象的特征主要包括: .封装,隐藏内部实现 .继承,复用现有代码 .多态,改写对象行为 采用C语言实现的关键是如何运用C语言本身的特性来实现上述面向对象的特征. 1.1 封装 ...

随机推荐

  1. Mybatis----Mapper配置文件

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...

  2. python基础二(list,tuple元祖、dic字典,字符串)

    一.列表list 1.list定义 列表即数组 ,list或array..列表中的每个元素都有自己的编号,从0开始,编号也可叫做下标,角标,索引.最后一个元素的下标也可用-1表示.: list定义时, ...

  3. Redis统计访问量方法

    1.统计客户忘问量 2.查询某位ID客户是否登录 一亿用户,统计数据10M左右,比较省空间 set usercount 0 设置一个变量,用于记录客户访问量setbit usercount 2 0   ...

  4. linux定时重启服务器

    需求说明 系统配置低了,且应用程序内一直在执行定时任务,在程序运行一段时间后,发现接口请求会变得很慢,需要每天定时凌晨重启服务器 脚本实现 1. linux 终端输入crontab -e,添加定时任务 ...

  5. 微服务架构之SpringCloud

    微服务架构之SpringCloud介绍 1.什么是微服务 2.SpringCloud架构 3.SpringCloud组件 4.微服务相关技术 Docker Jenkins

  6. JS 浏览器BOM

    BOM:Browser Object Model 浏览器对象模型 2.组成: window :窗口对象 1.创建: 2.方法: *与弹出框有关 1.alert(); 弹出警告框 2.confirm() ...

  7. ES6重度学习 demo实例

    let 与 const // 并非真正的常量 // const 的本质: const 定义的变量并非常量,并非不可变, // 它定义了一个常量引用一个值.使用 const 定义的对象或者数组,其实是可 ...

  8. springboot之零碎小知识

    1.springboot启动类加载yml配置项 主要是如下方法,读取了yml的配置项,赋值为类成员属性 @Autowired public void setEnvironment(Environmen ...

  9. stp域中两台switch互联接口出现两口均为root口 并且在现有stp区域中无法确定根桥设备位置;分析其原因并赋予解决办法

    stp域中两台switch互联接口出现两口均为root口 并且在现有stp区域中无法确定根桥设备位置:分析其原因并赋予解决办法 1.于上图描述了案例中当前组网环境的各交换机位置与stp状态情况  : ...

  10. 关于properties文件的一些问题

    在写properties文件时,比如jdbc.properties文件配置连接数据库的账号密码时,不要留有空格,不然会报错 com.mchange.v2.resourcepool.CannotAcqu ...