Objective-C和C ++有什么不同?

Objective-C和C ++在语法,function,范式,框架和库方面的主要区别是什么?

*重要提示:我的目标不是在两种语言之间展开战争。 我只想要真实的事实。 其实我的问题与performance无关! 请给任何看似主观的资​​料。

一些主要区别的短名单:

  • C ++允许多重inheritance,Objective-C不支持。
  • 与C ++不同,Objective-C允许命名方法参数,方法签名仅包含参数的名称和types以及返回types(请参阅下面的bbum和Chuck的注释)。 相比之下,C ++成员函数签名包含函数名称以及参数/返回types(不带名称)。
  • C ++使用booltruefalse ,Objective-C使用BOOLYESNO
  • C ++使用void*nullptr ,Objective-C更喜欢idnil
  • Objective-C使用“select器”( SELtypes)作为函数指针的近似等价物。
  • Objective-C使用一个消息范例(一个Smalltalk),你可以通过方法/select器把“消息”发送给对象。
  • Objective-C将乐意让你发送消息给nil ,与C ++不同的是,如果你试图调用nullptr的成员函数
  • Objective-C支持dynamic分派,允许类在响应消息时在运行时确定,而不像调用C ++的方法被调用的对象必须在编译时已知(参见下面的wilhelmtell的注释)。 这与以前的观点有关。
  • Objective-C允许使用“属性”为成员variables自动生成访问器。
  • Objective-C允许分配给self ,并允许类初始化(类似于构造函数)返回一个完全不同的类,如果需要的话。 与C ++相比,如果您创build了一个新的类实例(隐式地在堆栈中,或者显式地通过new ),它肯定是您最初指定的types。
  • 同样,在Objective-C中,其他类也可以在运行时dynamic地改变目标类,以拦截方法调用。
  • Objective-C缺lessC ++的命名空间function。
  • Objective-C缺less相当于C ++的引用。
  • Objective-C缺less模板,比较喜欢(比如)在容器中input弱types。
  • Objective-C不允许隐式的方法重载,但是C ++会。 也就是说,在C ++中, int foo (void)int foo (int)定义了foo方法的一个隐式重载,但是在Objective-C中实现同样需要显式重载- (int) foo- (int) foo:(int) intParam 。 这是由于Objective-C的命名参数在function上等同于C ++的名称修改。
  • Objective-C将高兴地允许一个方法和一个variables共享相同的名称,而不像通常适合的C ++。 我想这是Objective-C使用select器而不是函数指针来做的事情,因此方法名实际上没有“值”。
  • Objective-C不允许在堆栈上创build对象 – 所有对象都必须从堆中分配(显式地使用alloc消息,或者隐式地使用适当的工厂方法)。
  • 像C ++一样,Objective-C同时具有结构和类。 然而,在C ++中它们被视为几乎完全一样,在Objective-C中,它们的处理方式大不相同 – 例如, 可以在堆栈上创build结构。

在我看来,最大的区别可能是语法。 你可以用两种语言实现基本相同的事情,但是在我看来,C ++语法比较简单,而一些Objective-C的特性使得某些任务(比如GUIdevise)更容易归功于dynamic分派。

也许还有很多其他的东西,我错过了,我会更新与我想的任何其他事情。 除此之外,可以强烈推荐LiraNuna指导你。 顺便说一下,另一个感兴趣的地方可能是这个 。

我也应该指出,我自己刚刚开始学习Objective-C,因此上面的很多内容可能不完全正确或完整 – 如果是这样的话,我很抱歉,欢迎提出改进意见。

编辑:更新以解决在以下评论中提出的问题,增加了几个项目的名单。

虽然它们都植根于C,但它们是两种完全不同的语言。

一个主要的区别在于,Objective-C关注的是调度的运行时决策,而且在很大程度上依赖于它的运行时库来处理inheritance和多态,而在C ++中则主要集中在静态,编译时间和决策上。

关于图书馆,你可以用这两种语言使用普通的C语言库,但是他们的本地库是完全不同的。

有趣的是,你可以混合两种语言(有一些限制)。 结果被称为Objective-C ++ 。

他们完全不同。 Objective C与Smalltalk相比,与C ++有更多共同之处(除了语法外,实际上)。

closures我的头顶上:

  1. 样式 – Obj-C是dynamic的,C ++通常是静态的
  2. 虽然他们都是面向对象,我敢肯定,解决scheme将是不同的。
  3. 不同的对象模型(C ++受其编译时types系统的限制)。

对我来说,最大的区别就是模型系统。 Obj-C可以让你做消息传递和自省,但是C ++拥有如此强大的模板。

各有其长处。

正如其他人所说,Objective-C在思考对象和C ++的相当静态领域方面更具有dynamic性。

Objective-C是面向对象语言的Smalltalk系列,它的对象概念与Java,Python和其他“标准”,非C ++面向对象的语言非常相似。 很多的dynamic调度,没有运营商重载,发送消息。

C ++是它自己的奇怪的动物; 它大多跳过了家族树的Smalltalk部分。 在某些方面,它有一个好的模块系统,支持inheritance,恰好可以用于面向对象的编程。 事情更加静态(例如,可重写方法不是默认方法)。

Obj-C在语言本身中具有更多的dynamic能力,而C ++更侧重于具有一些dynamic能力的编译时function。

在编译时检查C ++参数多态,而在Obj-C中,参数多态是通过dynamic调度实现的,在编译时不检查。

Obj-C本质上是非常dynamic的。 您可以在运行时将方法添加到类中。 而且,它在运行时也反省了看课程。 在C ++中,类的定义不能改变,所有的反省都必须在编译时完成。 尽pipeObj-C的dynamic特性可以在C ++中使用函数映射(或类似的东西)来实现,但它仍然比Obj-C中的冗长。

在C ++中,可以在编译时进行更多的检查。 例如,使用变体types(如联合),编译器可以强制执行所有的情况都被写入或处理。 所以你不要忘记处理一个问题的边缘情况。 但是,所有这些检查在编译时都会付出代价。 Obj-C在编译时比C ++快得多。

Objective-C是C的更完美的超集。在C和Objective-C中,允许从void*到结构指针的隐式转换。

 Foo* bar = malloc(sizeof(Foo)); 

除非void指针被明确地强制转换,否则C ++将不会编译:

 Foo* bar = (Foo*)malloc(sizeof(Foo)); 

这与每天编程的相关性是零,只是一个有趣的琐事事实。