现在的位置:主页 > 综合新闻 >

真的可以啊,用C语言实现面向对象编程O O P!C语

来源:电脑编程技巧与维护 【在线投稿】 栏目:综合新闻 时间:2020-08-24

【作者】网站采编

【关键词】

【摘要】解释区分一下C语言和OOP 我们经常说C语言是面向过程的,而C++是面向对象的,然而何为面向对象,什么又是面向过程呢?不管怎么样,我们最原始的目标只有一个就是实现我们所需要

解释区分一下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\";

= 'b';

= 25;

= 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!!\\");

}

void printfBird(void *Bird){

if(NULL == Bird)

return ;

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

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

}

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

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;

= printBird;

= 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地址。

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

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

OOP真的那么重要?

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

文章来源:《电脑编程技巧与维护》 网址: http://www.dnbcjqywh.cn/zonghexinwen/2020/0824/402.html

上一篇:Java编程良心推荐--分布式架构原理解析
下一篇:工业机器人技术专业就业前景如何 2020年自动化机

电脑编程技巧与维护投稿 | 电脑编程技巧与维护编辑部| 电脑编程技巧与维护版面费 | 电脑编程技巧与维护论文发表 | 电脑编程技巧与维护最新目录
Copyright © 2018 《电脑编程技巧与维护》杂志社 版权所有
投稿电话: 投稿邮箱: