C++是完全面向对象的语言吗?

14

我读到有关Small Talk完全面向对象编程的文章。那么,C++也是完全面向对象编程吗?如果不是,为什么呢?


“small talk being completely object oriented”,你是在哪里看到的?只是好奇。 - o.k.w
什么是“完全”的意思? - Vladislav Rastrusny
10个回答

34

不是这样的。即使一次都不使用对象,你也可以编写出有效、良好编码、风格优美的C++程序。

C++支持面向对象编程,但面向对象并不是该语言本质上的特性。实际上,main函数并不是一个对象的成员。

在Smalltalk或Java中,你至少需要一个类才能系鞋带(或者输出“Hello, world”)。

当然,有人可能会争论Java也是完全面向对象的语言,因为它的基本类型(比如int)不是对象。


它甚至具有使其成为通用编程语言的实用程序,例如模板。但我看过许多学校级别的教科书将C++视为面向对象的语言。问题在于当作者这样做时,读者(主要是学生)方便地忘记了C++也适用于许多类型的编程语言。 - sjsam

6

C++包含'C'方言作为子集,允许纯过程式编码风格。


4
人们反对将C++定义为“纯”面向对象的主要论点是它仍然需要至少一个非面向对象的部分,即main()函数,并且并不是所有东西都是对象(如intlong等)。
此外,它还公开了对象的状态以供操纵,而不是使用消息传递范例(公共成员)。这破坏了对象的封装性。
另一方面,Java将main()函数作为类的静态方法,所以它更接近“纯”面向对象,但它仍然有非对象的部分。
Smalltalk通常被认为是最纯净的语言,但我对它了解不多,无法发表评论。
对我来说,我倾向于让知识分子继续争论,而我则专注于开发代码并为我的客户提供服务 :-)

不必实际需要main。它只是一个众所周知的入口点,所以命令行和(一些)GUI在加载完毕后知道将控制权传递给哪里。 - James Anderson

1

定义OOL。如果你的意思是使用类等,那么C++支持面向对象编程的OO-style,除此之外还有其他方式。你可以选择不使用类。而Java则不允许除了类以外的方式。(是的,我知道Java也支持FP。)


1
“是的,我知道Java支持FP。” 这对我来说很新鲜。你有Java中FP的任何示例吗? - Rafa Castaneda
一个简单的搜索就可以得到很多文章。其中之一是:http://www.ddj.com/java/184406320;jsessionid=NEAFYLK3RWELXQE1GHPCKH4ATMY32JVN?_requestid=113713 - dirkgently
Dirk,我想你可能是指Java支持过程式编程?对吗? - Binary Worrier
1
没有高阶函数的支持,任何在Java中的“函数式”代码都将变得非常复杂。虽然可能模拟实现,但这种努力只能被视为智力锻炼,并且在实际应用中几乎没有作用。 - MattDavey

1
短答案是否定的 - C++并非完全面向对象的语言。 你可以使用C++编写“不完全”面向对象的代码,甚至不需要借助于C子集。一个例子就是你的主函数 - 它不包含在任何类中。
主要原因是C++起源于C语言 - 当Stroustrup创建这种语言时,他旨在创建一个新版本的C语言(带有类)。事实上,他曾试图将他的创作提交为C语言的新风格(C84)。

0

C++并非纯面向对象编程语言,正如先前提到的那样,没有任何强制使用OOP概念的规定。C++是一种混合面向对象编程语言,因为它基于纯过程式语言C。

纯面向对象编程语言的例子包括C#和JAVA。


1
这两个都不是原始数据类型,它们不遵守用户定义数据类型的相同语义。对它们的操作不能通过传递消息来定义,并且不能在派生类中重载或重新定义它们。 - Omnifarious
2
不,Omni 的意思是说,既然 C# 和 Java 有像 int 和 long 这样的 对象的东西,它们就不是纯面向对象的。 - paxdiablo

0

不,它不是一种纯面向对象的语言。特别是在C++中,原始数据类型的规则通常与非原始数据类型不同。此外,还可以有与任何数据类型都没有关联的函数。C++不是纯面向对象语言的其他方式有很多,但这是其中最重要的两个原因之一。

Java和C#也不是纯面向对象的语言,因为它们具有原始数据类型,这些数据类型不遵守与“对象”数据类型相同的语义。


0

当然不会!!它支持内置数据类型。


-2

C++不过是“带类的C语言”。我仍然可以编写一个C程序并将其保存为.cpp文件。因此,推论证明“C++不是一种纯粹的面向对象的语言。”


1
C++已经不再是“带类的C语言”很长一段时间了 :-) - paxdiablo

-3
C++不是一种面向对象的语言的主要原因是它缺少封装的概念。由于指针可以让你完全控制一切,所以你无法为你的对象定义接口/契约。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接