这听起来像是一个巨魔问题,但由于C ++似乎很难完全掌握(而且我从未真正知道STL实际上是它的“部分”),我想知道使用C代替C ++有什么缺点什么时候不依赖OOP。
C ++有时可能会有非常复杂的语法,例如在尝试使用OGRE3D时,我有点困惑......
答案 0 :(得分:68)
C ++具有C语言的非OO功能:
struct
和enum
而无需编写struct
或enum
。for
答案 1 :(得分:23)
我是C
的忠实粉丝,随着时间的推移,他成为C++
的忠实粉丝。其中一个重要原因是STL(Standard Template Library)和Boost。
在它们之间,可以很容易地编写功能强大的便携式应用程序。
答案 2 :(得分:13)
一个未被提及的很多(但我认为值得注意)的“特性”是C ++编译器社区似乎愿意为了生成符合要求的实现而做更多的工作。当最终成为C89 / 90的标准开始工作时,几乎每个编译器供应商都按照标准的最新草案工作,并且(特别是当标准接近完成时)确实将大量工作紧密地整合在一起他们可以。
现在不再是这样了。 C99标准(显然已经足够)在十多年前完成了,但仍然基本上只有一个实现严格尝试符合整个标准(Comeau)。其他一些(例如,gcc)增加了一些C99功能,但仍然缺少其他一些功能。其中一个(pcc)处于相当自相矛盾的位置,几乎增加了C99特有的所有功能,但是不能满足C89 / 90的要求。
鉴于C ++的复杂性,生成符合标准的实现是一项很多更难的任务。尽管如此,我猜想已经有更多的实现至少非常接近于符合C ++ 0x(由于一年或两年后批准)而不是C99(大约十年前批准)。只是为了选择一个任意数字,我期望看到3个符合C ++ 0x的 1 实现比3个符合C99的实现更快(事实上,我几乎可以期待它的很多一天批准)。
答案 3 :(得分:11)
为什么C ++优于C?除了明显的功能列表之外,在我看来,真正的答案是还没有充分的理由继续使用C而不是C ++ 。即使您不使用OOP,也可以将其用作更好的C 。即使您在程序中仅使用C ++的一个独特功能,C ++也已成为赢家。
另一方面,使用C ++没有任何缺点:它保留了C的性能目标,它是一种非常低级的语言,同时允许非常强大的东西。并且您不会错过任何使用C ++的C功能!
不要忘记广泛的用户群以及丰富的库和框架。
顺便说一句,C99增加了一些有趣的功能,但十年之后,编译器支持仍然非常有限(所以你必须使用ANSI C)。与此同时,C ++也在不断发展,编译器供应商致力于提供符合要求的实现。
答案 4 :(得分:6)
与指针相比,引用自动完成并且更加安全,标准库更加广泛,模板使代码极其可定制,并且更加快速和安全。 C ++提供了出色的代码使用/重用和组织。另外,如果你不太依赖OOP,那么你做错了。有时候对象不合适,但它们并不是大多数场景。
答案 5 :(得分:3)
[注意:这是一种主观反应,但问题本身往往会引发主观的主观反应]。
C ++是一种多范式语言,它比OOP还要多得多。但是,建议它比C更好一点......大胆。 :-D在经验丰富的C编码器的手中,为了正确的目的,C代码可以非常优雅和简单。考虑用C编码的Lua解释器;它编译成一个非常小的二进制文件,即使在同等熟练的C ++程序员手中也可能会大得多,因此非常适合嵌入式使用。 C通常不会那么安全(例如:隐式转换,需要手动资源清理等)这是C ++努力比C做得更好的一件事,但它也不会给程序员带来笨拙的转换语法(在C ++中,不应该经常演员,但在C中它很常见),例如
另一方面,我试图非常普遍地说,C ++实际上可以更容易编写更高效的代码,特别是对于需要跨多种类型工作的代码。 qsort vs std :: sort基准测试是一个典型的例子,C ++如何通过模板和内联函数对象提供无成本的抽象。在C语言中,必须手动为每种类型编写单独的排序算法,或者将其填入宏中以获得可比较的结果。
从C迁移的大多数C ++程序员都不会回头。我可能是一个古怪的人,但我仍然发现C对于实现小规模库很有用。首先,端口和构建速度更快一些。对于这些事情,我认为隐式铸造是理所当然的。但是,我不愿意大规模地使用任何C代码,并且不幸的是不得不经常这样做。
至于具体的差异,sepp2k已经指出了一个相当全面的列表。
答案 6 :(得分:3)
在C语言中编写库的一个原因是,跨语言使用该库非常容易,因为与C ++ ABI的名称混乱相比,C ABI非常简单。 创建C ++库的C接口可能是一个不错的解决方案,但如果您可以使用C语法轻松表达您的API,为什么要用C ++编写它以开始?
许多C99功能非常好,但仍然没有使用C ++。
答案 7 :(得分:2)
除了sepp2k所指出的优势(并且我与之合作)之外,它肯定也有一些与OO没有直接关系的小缺点。请记住预处理器和上下文敏感性缺少__VA_ARGS__
。考虑类似的事情:
switch (argc) {
case 1: /* empty statement */;
toto T;
case 2: break;
}
在C中,只要编译器遇到这样的代码,并且argc
和toto
已知,这就是有效的。 (当然,我们之后可能会对单位化T发出警告,我们会使用它。)
在C ++中,这取决于类型 toto
。如果是POD,一切都很好(好,就像C一样好)。如果它有一个构造函数,则代码无效:跳转到case标签越过'toto T'的初始化。
因此,在某种意义上,对于C ++,您必须了解基础类型以查看控制流是否有效。
答案 8 :(得分:1)
您可以继续编写基本上C代码但将其编译为C ++并获得更强大的类型检查的好处,因此代码更强大。
如果您希望引入与OO无关的C ++有用元素,例如内置bool
,函数重载和更好定义的const处理(不需要使用宏)文字常数符号)。
使用一些更容易理解和使用标准库的元素(例如std::string
和iostreams,甚至std :: vector作为“更好的数组”)也不是太过分了。您不必学习很多C ++或了解OOP以利用这些改进的接口。
在OOP之间的过程编程有一个中间Object Based Programming,C ++支持它,它更容易理解和学习,几乎和完整的OOP一样有用。基本上它使用抽象数据类型而不是完整类,并避免继承和多态。说实话,这是许多C ++程序员在任何情况下编写的内容。