C和C ++之间的根本区别是什么?[关闭]


41

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

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


2
我以为C ++是C的超级集
用户

1
C ++是不是增强了...它是C的超集..
乔DF

2
@JoeDF刚开始的时候,但是实际上它现在与C兼容,根本就没有相同的意思。您没有在C ++中用C编写代码,并且并非所有标准C都与标准C ++兼容。
Klaim 2014年

+1您是对的,现在有兄弟或表兄弟。如果你明白我的意思。
Joe DF 2014年

Answers:


43

以下几点与C ++有关:

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

31

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

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

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

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

还有很多其他事情会占用我太多时间在这里列出。


我喜欢您撰写有关C ++构造函数与C结构的文章,并且它容易出错。我同意这一点。但是我不喜欢JavaBeans中使用Java的方式,该方式总是使用空的构造函数,然后使用setter设置成员字段。在我看来,这与C结构一样容易出错。我希望仅使用构造函数设置Java对象。请参阅我关于StackOverflow的问题
乔纳斯(Jonas)2010年

您在这里有一个要点,但是我的回答重点是C与C ++。
Jas

1
哦,来吧,谁阻止您将OOP与C一起使用?您可以重用对象并执行任何操作,甚至可以例外。甚至有一本关于它,称为C. OOP编程

2
@Vlad,您所谈论的一切都不是25年前的选择。
Jas

4
您可以使用几乎所有仍在使用的编程语言进行OOP,但这并不意味着该语言是为此而设计的。以Lua为例。尽管从技术上讲它允许OOP,但似乎有五十种不同的方法可以这样做,这引起了很多麻烦。
tyjkenn

15

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

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

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

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


4
C99具有布尔类型(名为_Bool,具有bool别名)。
杰里·科芬

1
严格来说,这不是真的。例如,C99的long long数据类型还不是ISO C ++的一部分。
Chinmay Kanchi,2010年

11
错误... C ++不仅是面向对象的:您可以将面向对象的范例与C ++一起使用,因为该语言为此提供了功能,但它也为其他范例提供了功能。您应该提到,这非常重要,它会改变一切。如果没有,我们都会切换到Java ...
Klaim 2010年

4
C中有许多构造在C ++中不起作用。

1
@klez:是的,但是仍然是错误的。虽然ANSI最初是开发C89(不具有布尔类型),但现在是由ISO完成新开发,并且ANSI接受ISO标准,因此当前的ANSI C标准与当前的ISO C标准相同(确实具有布尔类型)。
杰里·科芬

8

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

C99还向库中添加了很多C ++ 98/03标准中不存在的内容;不过,其中大多数已添加到C ++ 11。

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


1

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


1
嗯,带有继承的类怎么样?在C语言中,这确实是一项艰巨的工作,而使用预处理器宏可以完成许多模板。
JBRWilkinson

4
预处理器宏不是类型安全的。它是纯文本替换,这也使调试更加困难。在C中,要使基本类和继承起作用并不是很多工作。+您可以创建自己的元对象模型,而不必为语言设计者为您选择的任何事物所困扰。举例来说,
请参见此

2
我的投票将是C ++超过C的最重要功能的析构函数(甚至由于其惊人的清除功能,甚至超过了构造函数)。
Thomas Eding

@zvrba #define GENERATE_INTERFACE(T) T T##_func(T x);; (类型)C中的安全重载/模板。我同意Thomas的观点,即析构函数是C缺少的更重要的功能。但是析构函数通常会隐藏重要的代码。在我看来,命名空间(作用域)是最重要的。
YoYoYonnY
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.