it-swarm.cn

C和C ++之间的根本区别是什么?

许多人倾向于写“ C/C++”,好像他们是同一回事。尽管它们具有许多相似之处,但是显然它们并不相同。

但是C和C++之间真正的根本区别是什么? C++是C的增强版本,还是C中有C++中不存在的功能?

41
gablin

以下几点与C++有关:

  1. ((用户定义的)静态类型系统:允许对您的数据及其使用情况进行静态检查-指出C中许多容易完成的错误。
  2. multi-“ paradigm”:允许像在C中一样使用面向对象的范例,通用的范例等工作。
  3. Constructor/Destructor:唯一的方式来表达创建或销毁某些东西时的操作,并确保用户不必像在C语言中那样找到正确的函数并使用它。
  4. RAII(错误命名):您不必总是管理内存。只需将事情放在范围内,并使用描述对象寿命的智能指针即可。仍然可以使用原始指针。
  5. Templates:比宏更好,后者是一种真正的语言,可以在最终编译之前操纵和生成类型。仅缺少类型系统(请参阅将来的C++标准中的概念)。
  6. 运算符重载:允许以简单的句法方式描述操作,甚至可以在C++代码中定义嵌入式领域特定的语言。
  7. 作用域名称:命名空间,类/结构,函数等具有简单的规则以确保名称不冲突。
  8. 异常系统:一种传播错误的方法,通常比返回代码更好。实际上,返回码对于特定于域的逻辑错误很有用,因为应用程序必须对其进行管理。异常用于“硬”错误,这些错误使以下代码不正确。它允许在可能的情况下在调用堆栈中捕获更高的错误,对此类异常做出反应(通过记录日志或通过修复状态),并且如果使用得当,可以通过RAII进行操作,这不会使整个程序出错-如果执行得当,再次。
  9. 标准库: C有它自己的,但都是“动态的”。 C++标准库几乎(不是IO流))由模板(容器和算法)组成,仅允许根据您的使用生成代码。更好:由于编译器必须生成代码,因此它将非常了解上下文,并且会大量使用优化,而不必要求编码器混淆其代码-这要归功于模板和其他功能。
  10. const-correctness:确保不更改不应更改的变量的最佳方法。允许指定对变量的只读访问。而且仅在编译时进行检查,因此没有运行时成本。
43
Klaim

发明C++是为了管理C无法处理的复杂性。例如,C的一个常见问题是,由于没有封装,名称空间等,您可能“用完了变量名”(当然,从字面上看也不用)。

而且,C没有异常,因此错误处理非常容易出错,因为它依赖于库用户始终检查函数的返回值,而对于例外,库开发人员只是抛出一个异常,以确保程序流将停止。

C++通过使构造函数初始化对象(由编译器自动调用)来提供帮助。与需要由程序员初始化的C结构不同(因此,另一个容易出错的区域)。

最后,OOP还吹嘘了许多其他优点,例如对象重用以及基于通用编程的概念,例如允许您重用源代码的模板和泛型等。

31
Jas

通常,C++支持C中存在的所有内容。显然相反是绝对错误的。

简单来说,C++是面向对象的(例如,您有类),而C不是。

C++的布尔类型C89没有。

他们是不同的语言。它们只是共享大多数语法。

15
Federico klez Culloca

C99具有C++中不存在的某些功能(至少以完全相同的形式)(例如,灵活的数组成员,可变长度数组等)

C99还向库中添加了很多,而C++ 98/03标准中没有。不过,其中大多数已添加到C++ 11。

就基本方向而言,C基本支持结构化过程编程。 C++以及面向对象的程序设计,通用程序设计和元编程(在编译时执行任意计算)均支持该功能。在C++ 11中,它增加了一些点点滴滴,至少也可能会误认为函数式编程支持(例如lambda表达式)。 C++ 14增加了一些功能,但大多数功能确实更加方便,而不是方向上的任何重大变化。

8
Jerry Coffin

我个人认为模板是C++添加到C的最重要的功能。

1
zvrba