除了OOP之外,什么使C++比C更好

gok*_*oon 32 c c++

嗯,这可能听起来像一个巨魔问题,但由于C++似乎很难完全掌握(我从来没有真正知道STL实际上是它的"部分"),我想知道在不依赖时使用C而不是C++有什么缺点在OOP上.

C++有时候会有非常复杂的语法,这在我尝试使用OGRE3D时会让我感到困惑......

sep*_*p2k 69

C++不具备C语言的非OO功能:

  1. 模板
  2. 函数重载
  3. 参考
  4. 命名空间
  5. 您可以在没有写入的情况下或在每次声明或使用typedef之前使用structs和enums .structenum
  6. 即使你没有定义自己的类,使用C++的字符串和容器类仍然比使用c风格的字符串和数组更方便和安全.
  7. 输入类型安全(即使有人称之为弱)
  8. 例外
  9. 条件中的变量声明,C99只有它 for

  • 8.条件句中的变量声明,C99只在`for`中有它 (8认同)
  • 10.编译器实现的inane,long-windend错误.(这是一个功能,对吧?:)) (8认同)
  • 类型安全可能是经验丰富的C程序员的第一个也是最重要的优势. (3认同)
  • @Amnon:我想你可以在C99中省略`return 0;`. (2认同)

Rob*_*nes 23

我是一个大风扇C谁随着时间的推移已经成为一个大风扇C++.其中一个重要原因是STL(标准模板库)和Boost.

在它们之间,它使编写功能强大的便携式应用程序变得非常容易.


Jer*_*fin 13

一个未被提及的很多"特性"(但我认为值得注意)是C++编译器社区似乎愿意为了生成符合要求的实现而做更多的工作.当最终成为C89/90的标准开始工作时,几乎每个编译器供应商都按照标准的最新草案工作,并且(特别是当标准接近完成时)确实将大量工作紧密地整合在一起他们可以.

情况已经不是这样了.C99标准(显然已经足够)在十多年前完成了,但仍然基本上只有一个实现严格尝试符合整个标准(Comeau).其他一些(例如,gcc)增加了一些C99功能,但仍然缺少其他一些功能.一个(pcc)处于相当矛盾的位置,几乎增加了C99特有的所有功能,但是不能满足C89/90的要求.

鉴于C++的复杂性,生产符合标准的实现是一个更艰巨的任务.尽管如此,我猜想已经有更多的实现至少非常接近于符合C++ 0x(由于一年或两年后批准)而不是C99(大约十年前批准).只是为了选择一个任意数字,我希望看到3个符合C++ 0x的1个实现比3个符合C99的实现更快(事实上,我几乎可以预期它会被批准的那一天).

  1. 当然,在这种情况下"符合"意味着"在实践中" - 我很确定C和C++的每个实现都至少有一些缺陷会妨碍完美的一致性.大多数其他语言也是如此,唯一明显的例外是根据特定实现定义的语言.

  • @mlvljr:Microsoft为Visual C++开发了自己的前端.我同意杰瑞的观点,特别是因为一些主要供应商(如微软)完全放弃了C标准的一致性. (2认同)

lor*_*ova 12

为什么C++比C好?除了明显的功能列表之外,在我看来,真正的答案是没有充分的理由继续使用C而不是C++.即使您不使用OOP,也可以将其用作更好的C语言.即使您在程序中仅使用C++的一个独特功能,C++也已成为赢家.

另一方面,使用C++没有任何缺点:它保留了C的性能目标,它是一种非常低级的语言,同时允许非常强大的东西.并且您不会错过任何使用C++的C功能!

不要忘记广泛的用户群以及丰富的库和框架.

顺便说一句,C99增加了一些有趣的功能,但十年后仍然有非常有限的编译器支持(所以你必须使用ANSI C).与此同时,C++也在不断发展,编译器供应商致力于提供符合要求的实现.

  • 好的:无法编译错误,名称错误,代码大小,没有操作员超载的可能性(有时候人们在大于1的组中编写软件)等等.当然,我认为C++是一种很棒的语言并且有它的位置但是在那里说没有理由使用ANSI C因为C++有点荒谬. (7认同)
  • 一个很好的理由是****编译器更快**.第二,有些设备仍然不支持C++. (6认同)
  • 使用C的原因:因为它具有清晰可读的规范,几乎所有人都可以理解,只需要很少的耐心.因为它具有正式指定的语法.因为名称修改在某些情况下是令人讨厌的,即使你可以解决它.因为C99有一大堆很好的功能,但仍然没有在C++中.因为我经常处理没有C++支持的平台. (6认同)
  • 更快的编译器?在过去的15年中,C/C++编译器的研究和开发几乎完全由C++驱动.C编译器的性能提升是C++编译器改进的直接结果.几乎所有嵌入式设备都可以用C++编程(除了非常简单的PIC,你无论如何都会使用汇编代替C ......) (4认同)
  • 唯一真正的原因是没有C++支持的平台(就个人而言,作为嵌入式开发人员,我发现只有一次).所有其他原因都是毫无意义的,并且是那些不太了解C++的人的典型原因. (2认同)
  • @Andras:ANSI C是通常被称为C89的常见方式(甚至在K&R第2版书的封面上). (2认同)

Pup*_*ppy 6

与指针相比,引用自动完成并且更加安全,标准库更加广泛,模板使代码极其可定制,并且更加快速和安全.C++提供了出色的代码使用/重用和组织.另外,如果你不太依赖OOP,那么你做错了.有时候对象不合适,但它们不是大多数场景.

  • @Dead:嗯?那么`int array [10];`和`int(&ref)[10] = array;`? (6认同)
  • @DeadMG:你说"当你有一个int&,一个int在另一端",但这是一个逻辑谬误(过度概括).快速反例:`int*p = new int(); int&i =*p; 删除p;`现在你有这个很棒的`int&i`没有`int`.任何可能出现错误的指针都可能出错,因为对于任何指针`p`,`*p`是一个引用.引用并不比指针神奇地安全.此外,你向后看到了视觉提示,在*actual*参数列表中的`&`表示指针,没有引用的提示. (6认同)
  • 引用是常量指针+语法糖.安全性没有任何优势,它们消除了变量通过引用传递的视觉提示. (5认同)
  • @Ben:你只是不知道如何使用它们.指针可以指向数组,引用不能指向数组.指针可能会发生许多不好的事情,例如不同的间接级别和int转换.这些都没有发生在引用上.当你有一个int&时,一个int在另一端.至于视觉提示,它在&. (5认同)
  • -1为"做错了"和神话般的"参考安全". (2认同)