无法在C中实现的C++特性?

Sac*_*iya 8 c c++

我已经读过C++是C的超集,并通过创建对象提供实时实现.此外,C++对现实世界是封闭的,因为它充满了面向对象的概念.

C++中有哪些概念不能在C中实现?

  1. 有人说我们不能在C中编写方法,那么我们怎样才能有不同的风格printf()呢?例如,printf("sachin");将打印sachinprintf("%d, %s",count ,name);打印,1,sachin假设count是一个整数,其值为1,name是一个初始化的字符数组"sachin".
  2. 有人说数据抽象是用C++实现的,那么结构呢?

sha*_*kin 23

这里的一些响应者认为,使用C++代码可以生成的大多数东西也可以用具有足够野心的C生成.在某些部分中也是如此,但除非您修改C编译器以偏离标准,否则某些事情本身是不可能实现的.

Fakeable:

  • 继承(指向子结构中父级结构的指针)
  • 多态性(使用一组函数指针伪造vtable)
  • 数据封装(不透明子结构,实现未在公共接口中公开)

不可能:

值得一试:

  • GLib(C库)具有相当精细的 OO仿真
  • 我曾经发过一个关于人们在使用C而不是C++时最想念的问题.

关于RAII的澄清:

当涉及到最重要的方面时,这个概念通常会被误解 - 隐式资源管理,即保证(通常在语言层面)资源得到妥善处理的概念.有些人认为实现RAII可以通过将此责任留给程序员来完成(例如,在goto标签上显式析构函数调用),遗憾的是,这并没有提供RAII作为设计概念的安全原则.

来自维基百科文章的一篇文章,阐明了RAII的这一方面:

"因此,资源需要与合适对象的生命周期联系起来.它们是在初始化期间获取的,当它们在可用之前没有被使用的时候被获取,并且在相同对象被破坏时被释放,这保证会发生.即使出现错误."

  • @Adrian:关于动态投射的公平性,但我真的不能接受有关任何事情的论证,有足够的工作可行.这是无关紧要的.有足够的工作,我可以重建我的丰田,在15名乘客的水下驾驶,但那时它不再是丰田了. (4认同)
  • @Charles:是的,这是值得商榷的.继承和多态的管理不是C++中多态本身的特征.然而,根据定义,RAII是关于隐式资源管理的概念.所以我会说类似构造函数和析构函数的习语可以在C中实现,但你永远不会有RAII. (2认同)

Nic*_*kis 11

RAII模板怎么样?

  • +1在我看来,这是C++的优势.面向对象的东西很好,但不是那么重要. (5认同)
  • @Bluebird:请描述一下你将如何做到这一点. (5认同)

unw*_*ind 3

  1. printf()C 标准库中只有一个。其他品种则通过更改名称来实现,例如sprintf()fprintf()等等。

  2. 结构不能隐藏实现,C 中没有private数据。当然,您可以通过不显示例如指针指向的内容来隐藏数据,就像标准库对 FILE * 所做的那样。因此存在数据抽象,但不是构造的直接特征struct

另外,您不能在 C 中重载运算符,因此a + b始终意味着正在发生某种加法。在 C++ 中,根据所涉及对象的类型,任何事情都可能发生。

请注意,这(微妙地)暗示+在 C 中实际上is被重写了;与例如int + int的代码不同。float + int但你不能自己进行这种覆盖,这只是编译器的事情。

  • @Sachin:不,我不知道,对 printf() 的所有调用都将导致相同的入口点,其中代码将检查其第一个参数(格式说明符字符串)并根据需要读取其他参数。它只是一个根据其参数执行操作的函数,编译器不会根据参数跳转到不同的函数。所以不行。 (3认同)
  • @unwind:如果你问我的话,FILE* 是非常私密的。OO 是一种编码技术,而不是一种语言特性。 (2认同)
  • 不,因为它不像方法重载那样类型安全。如果传递的参数数量错误,它可能会崩溃。 (2认同)