在最近的一次采访中,我被问到一个问题,类和结构之间的区别是什么,这让我想到,如果区别只是关于访问说明符,我们可以在C中使用结构关键字,那么为什么C不是面向对象的。有人能解答我的疑惑吗?这种怀疑可能是天真的,但好奇心有它自己的方式。
o7jaxewo1#
这个问题的一个问题是,为了给予答案,我们首先需要定义“什么是面向对象的语言”。像C++这样的面向对象语言有许多Map到语言中的特性,但这并不意味着任何语言都需要拥有所有这些特性才能被认为是面向对象的。需要什么?
对我来说,最重要的特性之一是封装。通过封装,您可以将描述对象的数据和可以对对象执行的操作联系在一起。例如,汽车对象。它将有数据成员来描述它的颜色,齿轮类型,齿轮数量,车轮数量,当前速度等。然后它将有(成员)功能来操作汽车。你可以加速,刹车,左转等等。操作和数据被封装,即,当通过调用函数对对象执行操作时,描述该对象的所有数据对该函数可用。这种封装是面向对象编程的一个关键特性。封装不能由C来处理。我们可以用数据成员创建一个struct。我们甚至可以为操作添加(成员)函数(也称为函数指针)。因此,通过正确初始化C结构对象,我们可以编写OO风格的代码,如
struct
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风格的操作的好处(通常)很小-我们也可以这样做:
this
getSpeed(&mycar);
缺乏封装是C不是面向对象的一个原因。
gwbalxhn2#
在C中,struct和class之间的主要区别是,struct的成员默认为公有,而class的成员默认为私有。C中的struct不同,因为它不能包含成员函数,也不支持继承。它只是聚合不同类型变量的一种手段。虽然它可以包含函数指针,但它们并不像C中的成员函数那样固有地绑定到给定对象。虽然C语言将“对象”定义为“执行环境中的数据存储区域,其内容可以表示值”(C11 3.15),但struct不是面向对象的对象,即一组封装的数据和对它们进行操作的函数。
class
qfe3c7zg3#
为什么C不是面向对象的简短的回答- C语言在设计时并没有考虑到面向对象编程。C是。C中的struct与C中的class或struct之间的主要区别在于,您不能(轻松地)将 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语言进行面向对象编程,但这是一个很大的工作,可以说没有什么好处。
_Generic
9gm1akwq4#
在C中,class和struct是可以用来声明类的关键字。C缺少关键字class的事实并没有使它不那么面向对象。使它“不那么面向对象”的是C结构不能有成员方法,特别是它们没有构造函数也没有析构函数。然而,面向对象和非面向对象语言之间并没有明确的界限。面向对象是一种范式,语言本身或多或少地支持它。例如,Python不是面向对象的,是因为它没有“真实的”封装吗?当然不是。此外,考虑到C是从有类的C开始的。C++中内置的许多面向对象的特性可以在C中模拟。
4条答案
按热度按时间o7jaxewo1#
这个问题的一个问题是,为了给予答案,我们首先需要定义“什么是面向对象的语言”。
像C++这样的面向对象语言有许多Map到语言中的特性,但这并不意味着任何语言都需要拥有所有这些特性才能被认为是面向对象的。
需要什么?
对我来说,最重要的特性之一是封装。通过封装,您可以将描述对象的数据和可以对对象执行的操作联系在一起。
例如,汽车对象。它将有数据成员来描述它的颜色,齿轮类型,齿轮数量,车轮数量,当前速度等。然后它将有(成员)功能来操作汽车。你可以加速,刹车,左转等等。操作和数据被封装,即,当通过调用函数对对象执行操作时,描述该对象的所有数据对该函数可用。
这种封装是面向对象编程的一个关键特性。
封装不能由C来处理。
我们可以用数据成员创建一个
struct
。我们甚至可以为操作添加(成员)函数(也称为函数指针)。因此,通过正确初始化C结构对象,我们可以编写OO风格的代码,如但是...
C在成员之间没有自动的关系。我们不能调用成员函数并自动访问该对象的数据。C没有封装的概念。
在C中,当调用一个成员函数,需要访问同一个对象的数据成员时,我们需要传递对象本身(的地址)以访问数据。比如:
在面向对象语言中,这通常被称为
this
指针,它是隐式可用的-您不需要传递它。但是在C中,你必须显式地传递它。因此,使用函数指针成员来获得OO风格的操作的好处(通常)很小-我们也可以这样做:缺乏封装是C不是面向对象的一个原因。
gwbalxhn2#
在C中,
struct
和class
之间的主要区别是,struct
的成员默认为公有,而class
的成员默认为私有。C中的
struct
不同,因为它不能包含成员函数,也不支持继承。它只是聚合不同类型变量的一种手段。虽然它可以包含函数指针,但它们并不像C中的成员函数那样固有地绑定到给定对象。虽然C语言将“对象”定义为“执行环境中的数据存储区域,其内容可以表示值”(C11 3.15),但
struct
不是面向对象的对象,即一组封装的数据和对它们进行操作的函数。qfe3c7zg3#
为什么C不是面向对象的
简短的回答- C语言在设计时并没有考虑到面向对象编程。C是。
C中的
struct
与C中的class
或struct
之间的主要区别在于,您不能(轻松地)将 code 与C中的结构体相关联。不能在C中的struct
示例上执行方法,例如或
相反,您必须将这些
struct
示例作为参数传递给函数,如C只是没有提供使面向对象编程变得简单的工具--没有封装、没有继承、没有多态性(好吧,有
_Generic
,但不完全一样)。你可以用C语言进行面向对象编程,但这是一个很大的工作,可以说没有什么好处。
9gm1akwq4#
在C中,
class
和struct
是可以用来声明类的关键字。C缺少关键字class
的事实并没有使它不那么面向对象。使它“不那么面向对象”的是C结构不能有成员方法,特别是它们没有构造函数也没有析构函数。然而,面向对象和非面向对象语言之间并没有明确的界限。面向对象是一种范式,语言本身或多或少地支持它。例如,Python不是面向对象的,是因为它没有“真实的”封装吗?当然不是。此外,考虑到C是从有类的C开始的。C++中内置的许多面向对象的特性可以在C中模拟。