李建华 发表于 2023-10-3 19:22:53

C 与 C++ 的真正区别在哪里?

除了面向对象与面向过程这个回答之外,C 与 C++ 的真正区别在哪里?
这几年不管是社团实习工作面试都有被问到这个问题。但是「面向对象以及面向过程」这个回答似乎都不是最好或者最完善的答案。
希望能从语言的语言特性,使用场景,设计哲学等方面得到完整解释。

joevan 发表于 2023-10-3 19:23:02

首先,这个问题根本没有简单的答案,选3个角度谈就能写3篇论文。
比如前面的高赞答主,就是每人选了一个角度说,说的都比较到位 :)

简单说说几个常见的误区。
误区1:C++是面向对象的C?并不是。
现代C++是至少四种编程范式的集合体(面向过程,面向对象,泛型编程和元编程,函数式编程等,实际可能不止4种)。说C++是面向对象语言,是一种很瞧不起C++的说法,因为面向对象仅仅是C++的多种范式之一。

http://pica.zhimg.com/50/v2-d30d44f2ffc98d02cf5eea68a811febb_720w.jpg?source=1940ef5c

瞧谁不起

就好比有人说你数学学得不错,加减乘除都会,你一定很崩溃。
误区2:C是面向过程语言?不能这么说。
在面向对象方面,C语言提供的语法支持比较薄弱,但这不表示C是面向过程的语言。用C语言写面向对象程序不仅不弱,甚至会有一些优势。
世界上有很多非常重要的、大量使用面向对象技术的软件是用纯C写的。例如Linux的图形界面GNOME。

http://picx.zhimg.com/v2-0975ff62ac2a353367cdf96df2419584_r.jpg?source=1940ef5c

上图整个图形界面就是基于GNOME实现的

用C写面向对象程序,虽然门槛较高,但也会有一些额外的好处。初学者可参考:C 语言实现面向对象编程_onlyshi的专栏-CSDN博客_c语言面向对象编程
误区3:C是C++的子集,C支持的语法C++都支持。不对。
C++在最初设计时是基于C的,绝大多数语法都兼容。但是,在一些细节却重要的地方,二者差别非常大。
例如,C语言的函数指针非常神奇:
int (*pfunc)();看上去pfunc可以指向返回值为int,无参数的函数?并不是。
实际上pfunc可以指向任意返回值为int的函数,无论参数是什么。
而无参的情况必须写明参数为void:
int (*pfunc)(void);C语言不必指定参数类型也可以引用函数,这一点让C语言具有很强的动态特性。而C++去除了这种设计,因为破坏了类型安全。
同理,C语言常用的(void*)转换在C++中也在很大程度上摒弃了,理由也是类型不安全。
哪个设计好哪个不好不重要。重要的是:C并不是C++的子集,C++也不是C的超集。它们在语法、设计理念、常用写法方面均有不同,到今天二者的差别越来越大。
误区4:C++比C功能多,所以C++运行比C慢一点。不对。
虽然C++加入了很多很多功能,但由于绝大多数功能都是在编译器上做手脚,大多情况下仅影响编译速度,而不影响运行速度。
而且泛型、元编程等技术用好了,能让C++的程序运行的更快。
反而是C,由于大量使用不定类型的转换,损失的性能相当可观。

总之,C与C++的区别远不是一段话能够讲清楚。
建议在对C++没有深入了解的时候,慎重讨论C++。毕竟这是一门谁都不敢说精通的语言。

0nwn0 发表于 2023-10-3 19:23:44

我感觉吧……
C++是:
我全都要,但鉴于你们有些人不想要,我就把要的东西的共同部分抽象出来加到新版本里,需要的人你们自己去做就好了。
C是:
没什么是指针和宏不能解决的,加那么多东西没意义。

于是就变成了
C++看起来很强大(也的确很强大),但你真用起来发现其实什么(库)也没有……
C看起来什么都能做到(汇编小声嘀咕:我也可以),但真写起来其实就是把C++再发明了一遍(有些还真做不到)……

说面向对象/面向过程区别必然是错的,因为C的程序写大了不可避免地还是要模拟一下面向对象的,而C++本身根本不局限于面向对象……
之所以很多人都在支持C而不是C++,一方面是C++真的很复杂很抽象,另一方面是因为需求复杂的通常不用C/C++写了,而常用C/C++写的又用不上C++一堆新特性……

最后吐槽一下C++:C++每次出新版本都会变得更好,但总是只把别人的痛点解决一半,因为他们认为全部解决完会对没有这个痛点的人产生不好的影响。

scrollll 发表于 2023-10-3 19:24:44

C:
void qsort(void* base, size_t num, size_t size, int (*compar)(const void*,const void*));C++:
template< class RandomIt >
constexpr void sort( RandomIt first, RandomIt last );

一江不理我 发表于 2023-10-3 19:25:34

C++ 几乎是 C 的超集,只有少量功能 C++ 不支持。
C++ 多出来的东西太多,很难列举,我截 cppreference 的图直观比较一下吧。
C language

http://pic1.zhimg.com/ef1bd7c8d0129eb61578605baaef20d5_r.jpg?source=1940ef5c

C++ language

http://pic1.zhimg.com/3c15be4b7e168355373109e39db31662_r.jpg?source=1940ef5c

可以看到,C++ 比 C 多了 classes、templates、exceptions 这些部分,而每个部分也有很多新增的东西。这还只是语言部分,还未谈及标准库。C 有 29 个标准库头文件,C++ 有 87 个,除了量,C++ 标准库的功能要复杂得多。
关于 C/C++的做用时机,引用旧文《
C++强大背后 - Milo Yip》的一段落:
使用C++还是C?C++ 和 C 的设计哲学并不一样,两者取舍不同,所以不同的程序员和软件项目会有不同选择,难以一概而论。与 C++ 相比,C 具备编译速度快、容易学习、显式描述程序细节、较少更新标准(后两者也可同时视为缺点)等优点。在语言层面上,C++ 包含绝大部分 C 语言的功能(例外之一,C++没有C99的变长数组VLA),且提供 OOP 和 GP 的特性。但其实用 C 也可实现 OOP 思想,亦可利用宏去实现某程度的 GP,只不过 C++ 的语法能较简洁、自动地实现OOP/GP。C++ 的 RAII(resource acquisition is initialization,资源获取就是初始化)特性比较独特,C/C#/Java 没有相应功能。回顾历史,Stroustrup 开发的早期 C++ 编译器 Cpre/Cfront 是把 C++ 源代码翻译为 C,再用 C 编译器编译的。由此可知,C++ 编写的程序,都能用等效的 C 程序代替,但 C++ 在语言层面上提供了 OOP/GP 语法、更严格的类型检查系统、大量额外的语言特性(如异常、RTTI等),并且 C++ 标准库也较丰富。有时候 C++ 的语法可使程序更简洁,如运算符重载、隐式转换。但另一方面,C 语言的 API 通常比 C++ 简洁,能较容易供其他语言程序调用。因此,一些 C++ 库会提供 C 的 API 封装,同时也可供 C 程序调用。相反,有时候也会把 C 的 API 封装成 C++ 形式,以支持 RAII 和其他 C++ 库整合等。

qswh 发表于 2023-10-3 19:26:29

我认为,一个是在裸奔,一个是在穿着皇帝的新衣裸奔。。。
<hr/>写点正经的吧。
C++里面很多东西都可以在C里面用稍微别扭一些的方式实现,但有些东西是基本无法自动实现的,或者人工代价很大,主要是:

[*]自动的对象作用域,以及基于它的生命周期管理。
[*]强类型的模板。
页: [1]
查看完整版本: C 与 C++ 的真正区别在哪里?