C语言作为一个语言不在任何意义上比C++好。
----修订----
但是C有几个决定性的优势:
C没有C++的ABI问题
C的生成代码尺寸可控
---修订结束---
C++提供了重要的抽象手段,这些手段被证明对于工业化代码生产是必须的,这里面至少包括范型、数据抽象、面向对象、异常、RAII等。
正是C++提供的上述设施,是的如同C/C++这样的Native的、静态类型的传统系统编程语言,竟然有了生产通用的程序库的可能,这是在C里面从来没有做到的,C雄霸计算机界几十年,坐拥最优秀的人才,最庞大的人力,到如今,几乎每个C工程都必须为自己准备或定制基础数据结构设施,这不是没有原因的,其原因就是,C在这个方面完败给了C++,C语言就不是一个可以制作通用数据结构库的语言。
哪怕只是为了使用STL,在可能的情况下都应该使用C++,而不是C。
C++的C部分,一般来说,也比相应的Ansi C更好,有更强的类型检查,更方便的类型检查,更方便、明确的初始化语义(是std::fill(blabla)还是memset(blabla)好?更何况后者很可能还不正确)。
C++提供的数据抽象和面向对象的支持,在这几十年中,被几乎所有的后来者沿用,新兴的工业语言C#/Java,没有一样不是以类似C++的方式提供这些东西的,并且只有在C++里面,这些东西是以不带来额外代价的方式提供的。
关于C++比C性能差的说法几乎总是胡说八道,没错,虚函数总是比直接的函数调用慢,但是,直接的函数调用和虚函数不是一样的功能!在C里面,这可能需要根据某种类型标识去分派,或者使用函数指针,这不仅并不比C++快,而且无论以何种审美观来看,都不如C++的方式优雅。
有的人会争辩C++提供的功能实际上是不被需要或者不太被需要的,这太霸道和傲慢了,如果C程序员从来就不需要那些东西,C里面就不会出现那么多模拟动态绑定、面向对象、范型等C++特性的所谓idioms了,正常审美观的人不会认为把数据和函数指针放在一个struct里面模拟数据抽象比C++的方式好。
C++在某些方面,甚至比人们想象的更好,比方说因为RAII的存在,C++里面的异常安全要比其他语言容易一些,正是因为这样,C#引入了using
(){}这样的形式,Java引入了try-with,Python加入了with,这都是学习C++的RAII,但无一例外比C++的要差。
当然,C++也有一些问题,比如标准库不够好,没有memory
model,一些语言特性不够明确,比方override不是明确的,而C#就以override关键字明确了其行为,异常不够好用,没有语言级别的stacktrace等等。但在这些缺点上,C总是比C++走的一样远,如果不是更远的话。
超集之说只是描述了C++和C的沿袭关系,C++向前兼容C. 但是使用两个语言的指导思想、代码风格、设计思路等等是完全不同的,可以认为是两个不相干的语言,粉丝互喷也属正常。用了几年C++,感觉最大的问题是C++太复杂。
假设C++是一把瑞士军刀,包含了水果刀的功能,你会只把它当水果刀使吗?更大的问题是还不如水果刀好用。
按照C的方式写出来的是C程序,哪怕扩展名用的是cpp