C++是一种面向对象的编程语言吗?

34

我经常听说C++不是面向对象的,而是“带类的C语言”。所以,当我告诉面试官C++实际上并不是真正的面向对象语言时,他问我为什么不认为它是面向对象的。自从大学以来,我已经没有接触过C++,并且没有很好的答案。那么,C++是面向对象的还是不是?为什么?


51
哈哈,面向对象编程语言只是受到“无真正苏格兰人谬论”(http://en.wikipedia.org/wiki/No_true_Scotsman)的影响。 - Jacob
3
如果你想要一个真正面向对象的 C 语言,那么你可以选择 Obj-C。但是我不喜欢它,你也可能不会喜欢。 - thyrgle
33
为什么你会毫无思考地将别人的观点冒充为自己的,却没有任何依据来支持你的主张? - Shawn D.
8
“面向对象”这个术语似乎没有全球通用的定义,有人认为任何可以通过对象实现分隔的编程语言都是面向对象的,而还有些人则认为它必须具备虚函数、继承、多态性等特性。 - dreamlax
6
你有实际的C++经验吗?还是只是随便说出了你在某处读到的东西?当你没有论据支持你的观点时,“我听说它不是真正的面向对象”比“它不是真正的面向对象”更好用。 - David Thornley
显示剩余8条评论
18个回答

80

C++通常被认为是一种“多范式”语言。也就是说,它可以用于面向对象编程、过程式编程,甚至是函数式编程。

那些否认C++是面向对象编程的人通常会对原始类型不是对象本身提出批评。按照这个标准,Java也不会被视为面向对象编程。

当然,C++在面向对象编程方面不像Smalltalk、Ruby、Self等语言那样强大,但是从大多数标准来看,它绝对是一种有效的面向对象语言。


19
基本类型通常被标准称为对象,而像 typedef int INT; 5 .INT::~INT(); 这样令人惊讶的代码也可以正常工作。(必须在句点前面加一个空格以便将其视为非十进制数字,并且出于语法考虑,您必须间接地命名类型 int。)该语言被定义为表现得好像 operator 函数已经为原生类型定义好了,以便查找应该如何处理表达式。这种语法有点不统一,但不像“他们”所说的那么糟糕,并且基本对象的成员函数被高估了。 - Potatoswatter
1
我相当确定标准不会混淆类型和对象。原始类型的实例是一个对象,但类型不是。此外,在我看来最大的错误是:您不能获取operator+(int, int)的地址并将其传递给算法。 - MSalters

27

机器人Java也支持泛型编程。 - Code Warrior
1
@ShubhamPatel 你不能将C++模板系统的强大和表现力与Java的通用语法糖进行比较。实际上,C++模板系统是图灵完备的。 - ebasconp

19

C++是一种面向对象的语言。但有些语言狂热者对面向对象的定义存在争议。例如,一些Java人士认为C++不是一种面向对象的语言,因为你可以在类外定义函数。

不必理会他们。


1
不一定是“狂热者”,发明面向对象编程术语的人(也许从未正式规范化)对其进行了定义,而C++并不符合该定义。此后,许多人跳上了面向对象编程的大车,并且现在似乎所有形式和定义的面向对象编程都同样“有效”,因为大多数人不知道最初的定义。 - hasen
5
@hansenj - 你能否提供可信的参考资料来加强你的评论,包括a)从发明OOP术语的人那里得到OOP的定义,b)展示C++不符合该定义。 - null

17

啊!那些说C++不是面向对象的人,和那些说Spam不是食品的人是一样的 :-)

面向对象的“宗教狂热者”会说只有在所有东西都是对象的情况下才能拥有真正的面向对象语言。那没关系,他们可以坐在他们的象牙塔里相信他们想要相信的东西。我们中的一些人有实际工作要做。

只要你使用面向对象的思维方式,C++(甚至是C,如果你在结构体内使用各种技巧与函数指针)就足以被认为是面向对象的。


象牙塔?Python怎么会是象牙塔?Ruby怎么会是象牙塔? - hasen
4
@hasen,Python和Ruby本身并不是象牙塔。那些使用Python或Ruby的人却坚称C ++不可能是面向对象编程的,他们就是把它们当作象牙塔在使用。 - paxdiablo
2
好的,明显Spam不是食物。它是一种类似食品的产品。然而这并没有涉及到C++... - Brian Postow
@paxdiablo:暗示“象牙塔”意味着你的对手对现实世界一无所知。这里有一些来自现实世界的消息:Python和Ruby比C++更具生产力和愉悦性。而且,猜猜看,所有东西都是对象;甚至函数也是。现在,试着用C++制作一个Web 2.0应用程序吧 :P - hasen
4
Python和Ruby确实很棒,但其他语言的优点与否与C++是否是面向对象无关。 - Jeremy Friesner
5
无论如何,看起来你没有理解重点。生产Web 2.0应用程序的能力从何时开始是判断一种语言是否是面向对象语言的相关要求了?提到象牙塔是指那些坚持除非万物皆为对象否则一种语言不能是面向对象的人们。这与Python是一种好语言以及制作Web 2.0应用程序的容易程度无关。@hasen j:http://www.webtoolkit.eu/ - jalf

14

嗯。每个人对OOP都有自己的定义。发明OOP术语的Alan Kay说:http://www.noulakaz.net/weblog/2007/02/12/true-meaning-of-oop/

对我来说,OOP仅意味着消息传递、局部保留和保护以及隐藏状态过程,以及所有事物的极端后期绑定。这可以在Smalltalk和LISP中完成。可能还有其他系统也能实现,但我不知道。

按照这个定义,即使是Java、C#、Python等语言也不是面向对象的语言。

我个人认为,这些讨论没有意义。


8

对象导向的特征包括抽象、封装、多态和继承。

我认为C++具有这四个特点,因此它可以被归类为面向对象语言。

当然,也可以将C++看作“更好的C语言”,使用纯过程式编程风格来编写。并不一定要使用对象。或许这就是你的想法。


3
这只是面向对象(OO)的一个定义(实际上把OO与更一般的模块化/ ADT抽象和封装原则混淆了起来)。如果与另一种OO编程(比如Smalltalk)的人交谈,你会发现对象导向的核心特征是在对象之间传递消息。很难确定OO的一个定义。 - Michael Ekstrand
"conflates"? 我不知道你的意思。你是说模块化和封装的原则不是面向对象编程的一部分吗?我也可以用函数式风格传递消息。 - duffymo

6

C++是一种面向对象的语言。
但这并不是C++唯一适用的编码风格。因此,C++技术上是具有多重范式的语言,而面向对象仅是其中一种范式。

术语“带类的C”有几种含义。

  • 它可以指的是C++是面向对象的(因为类给予了它面向对象的能力)。
  • 它可以指的是“cfront”的原始版本
    • 基本上只是C语言加上类和很少其他内容。
  • 它可以(贬义地)指一个编程风格,该风格未充分利用C++的全部功能,而只使用了该语言的一小部分。

Stroustrup最初开发的东西被称为“C with Classes”,根据他的《C++设计与演化》(一本非常好的书)。 “C with Classes”不仅仅是对C++起源的描述,它也是一个名称。 - David Thornley

6

这个想法是,C++ 不仅仅是一门面向对象的语言。


5

C++是面向对象的,因为类提供了抽象和继承等功能。虽然代码不一定需要面向对象,但C++通常被认为是面向对象的语言。这就好比说Scheme不是函数式编程语言,因为它有set!操作。


4

正如其他人所说,C++不是一种纯面向对象的语言。再说了,我知道的唯一的纯面向对象语言是Smalltalk。我知道的唯一的纯函数式语言是Lambda演算。我不知道任何纯结构化语言(它们都有goto和/或多个返回语句)

大多数人不喜欢使用纯编程语言写作。这会限制他们的风格。


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