为什么C语言不是面向对象的语言,即使它有(结构)结构关键字,这是相同的类关键字的C++?

m4pnthwp  于 2023-10-16  发布在  其他
关注(0)|答案(4)|浏览(160)

在最近的一次采访中,我被问到一个问题,类和结构之间的区别是什么,这让我想到,如果区别只是关于访问说明符,我们可以在C中使用结构关键字,那么为什么C不是面向对象的。有人能解答我的疑惑吗?这种怀疑可能是天真的,但好奇心有它自己的方式。

o7jaxewo

o7jaxewo1#

这个问题的一个问题是,为了给予答案,我们首先需要定义“什么是面向对象的语言”。
像C++这样的面向对象语言有许多Map到语言中的特性,但这并不意味着任何语言都需要拥有所有这些特性才能被认为是面向对象的。
需要什么?

  • 封装?
  • 继承?
  • 多形化?
  • 。等等。。

对我来说,最重要的特性之一是封装。通过封装,您可以将描述对象的数据和可以对对象执行的操作联系在一起。
例如,汽车对象。它将有数据成员来描述它的颜色,齿轮类型,齿轮数量,车轮数量,当前速度等。然后它将有(成员)功能来操作汽车。你可以加速,刹车,左转等等。操作和数据被封装,即,当通过调用函数对对象执行操作时,描述该对象的所有数据对该函数可用。
这种封装是面向对象编程的一个关键特性。
封装不能由C来处理。
我们可以用数据成员创建一个struct。我们甚至可以为操作添加(成员)函数(也称为函数指针)。因此,通过正确初始化C结构对象,我们可以编写OO风格的代码,如

mycar.getSpeed();

但是...
C在成员之间没有自动的关系。我们不能调用成员函数并自动访问该对象的数据。C没有封装的概念。
在C中,当调用一个成员函数,需要访问同一个对象的数据成员时,我们需要传递对象本身(的地址)以访问数据。比如:

mycar.getSpeed(&mycar);
\------------/ \^^^^^/
   oo style      but explicit passing pointer to
    call         the object violates the encapsulation principle

在面向对象语言中,这通常被称为this指针,它是隐式可用的-您不需要传递它。但是在C中,你必须显式地传递它。因此,使用函数指针成员来获得OO风格的操作的好处(通常)很小-我们也可以这样做:

getSpeed(&mycar);

缺乏封装是C不是面向对象的一个原因。

gwbalxhn

gwbalxhn2#

在C中,structclass之间的主要区别是,struct的成员默认为公有,而class的成员默认为私有。
C中的struct不同,因为它不能包含成员函数,也不支持继承。它只是聚合不同类型变量的一种手段。虽然它可以包含函数指针,但它们并不像C
中的成员函数那样固有地绑定到给定对象。
虽然C语言将“对象”定义为“执行环境中的数据存储区域,其内容可以表示值”(C11 3.15),但struct不是面向对象的对象,即一组封装的数据和对它们进行操作的函数。

qfe3c7zg

qfe3c7zg3#

为什么C不是面向对象的
简短的回答- C语言在设计时并没有考虑到面向对象编程。C是。
C中的struct与C
中的classstruct之间的主要区别在于,您不能(轻松地)将 code 与C中的结构体相关联。不能在C中的struct示例上执行方法,例如

list.sort();

sequence.average();

相反,您必须将这些struct示例作为参数传递给函数,如

sort( &list );        // have to pass a pointer since we're going to modify list
average( sequence );

C只是没有提供使面向对象编程变得简单的工具--没有封装、没有继承、没有多态性(好吧,有_Generic,但不完全一样)。
你可以用C语言进行面向对象编程,但这是一个很大的工作,可以说没有什么好处。

9gm1akwq

9gm1akwq4#

在C中,classstruct是可以用来声明类的关键字。C缺少关键字class的事实并没有使它不那么面向对象。使它“不那么面向对象”的是C结构不能有成员方法,特别是它们没有构造函数也没有析构函数。
然而,面向对象和非面向对象语言之间并没有明确的界限。面向对象是一种范式,语言本身或多或少地支持它。例如,Python不是面向对象的,是因为它没有“真实的”封装吗?当然不是。此外,考虑到C
是从有类的C开始的。C++中内置的许多面向对象的特性可以在C中模拟。

相关问题