Objective-C与C ++有何不同?[关闭]


171

在语法,功能,范例,框架和库方面,Objective-C和C ++之间的主要区别是什么?

*重要:我的目标不是在两种语言之间展开性能大战。我只想要真实的事实。实际上,我的问题与性能无关!请提供任何看似主观的信息。


2
本指南提供了我所见过的最好的比较。
LiraNuna

@Oskar Kjellin:Mac和LiraNuna的答案都是很好的答案。我不能客观地决定哪一个是最好的,因为两者都可以相互补充。
Alerty

@Alerty我知道(我自己经常跌倒)。也许只是将最上面的一个标记为已回答,这是我在无法决定时要做的。我不喜欢有未回答的问题时:(
Oskar Kjellin'Apr 6'10

1
在第一答案中添加指向第二个答案的链接,反之亦然
Lee Taylor

Answers:


185

一些主要差异的简短列表:

  • C ++允许多重继承,而Objective-C则不允许。
  • 与C ++不同,Objective-C允许命名方法参数,并且方法签名仅包含参数的名称和类型以及返回类型(请参见下面的bbum和Chuck的注释)。相比之下,C ++成员函数签名包含函数名称以及仅参数/返回的类型(不包含其名称)。
  • C ++的用途booltrue以及false,Objective-C中的用途BOOLYESNO
  • C ++使用void*and nullptr,而Objective-C则首选idand nil
  • Objective-C使用“选择器”(类型为SEL)近似等效于函数指针。
  • Objective-C使用消息传递范例(la Smalltalk),您可以在其中通过方法/选择器向对象发送“消息”。
  • nil与C ++不同,Objective-C会让您愉快地向发送消息到C ++,如果您尝试调用的成员函数,C ++将会崩溃nullptr
  • 与C ++不同,Objective-C允许动态调度,从而允许在运行时确定对消息做出响应的类,在C ++中,必须在编译时知道调用方法的对象(请参见下面的wilhelmtell的注释)。这与上一点有关。
  • Objective-C允许使用“属性”自动生成成员变量的访问器。
  • Objective-C允许分配给self,并允许类初始化程序(类似于构造函数)在需要时返回完全不同的类。与C ++相反,在C ++中,如果您创建类的新实例(隐式地在堆栈上,或通过显式地new),则可以保证它是您最初指定的类型。
  • 同样,在Objective-C中,其他类也可以在运行时动态更改目标类以拦截方法调用。
  • Objective-C缺少C ++的名称空间功能。
  • Objective-C缺少等效于C ++的引用。
  • Objective-C缺少模板,因此(例如)倾向于允许在容器中进行弱键入。
  • Objective-C不允许隐式方法重载,但C ++允许。即,在C ++ int foo (void)int foo (int)定义该方法的一个隐式过载foo,但要达到相同的目标C需要明确的重载- (int) foo- (int) foo:(int) intParam。这是由于Objective-C的命名参数在功能上等同于C ++的名称处理。
  • 与C ++通常适合的情况不同,Objective-C将很乐意允许方法和变量共享相同的名称。我想这与使用选择器而不是函数指针的Objective-C有关,因此方法名称实际上没有“值”。
  • Objective-C不允许在堆栈上创建对象-所有对象都必须从堆中分配(通过alloc消息显式分配,或在适当的工厂方法中隐式分配)。
  • 像C ++一样,Objective-C同时具有结构和类。但是,在C ++中,它们几乎完全一样,而在Objective-C中,它们却被大相径庭-例如,您可以在堆栈上创建结构。

我认为,最大的不同可能是语法。您可以用两种语言实现基本相同的事情,但是我认为C ++语法更简单,而Objective-C的某些功能由于动态分配而使某些任务(例如GUI设计)更容易。

我可能还错过了许多其他事情,我将用我想到的其他任何事情进行更新。除此之外,可以强烈推荐LiraNuna指向您的指南。顺便说一句,另一个感兴趣的站点可能是this

我还应该指出,我本人只是开始学习Objective-C,因此上述内容可能并不完全正确或不完整-如果是这种情况,我深表歉意,并欢迎提出改进建议。

编辑:更新以解决以下评论中提出的要点,将更多项目添加到列表中。


8
体面的名单;一处更正。它们不是“命名参数”,而是“交错参数”。命名和“关键字参数”导致混淆的想法,即可以省略方法名称的某些子集。这不可以。
bbum 2010年

7
您忘了争取最重要的区别:Object-C使用动态调度,而C ++使用静态调度。换句话说,由Objective-C编译器编译的代码将具有负责响应运行时确定的消息的类。由C ++编译器编译的代码在编译时已计算并编译了此信息。
维尔特尔2010年

9
@wilhelmtell:C ++编译器在编译时仅知道超类。在运行时,实际的类可以是任何后代。这也是动态分配的一种形式,但与目标C中使用的形式不同。请小心使用这些技术术语!
Norman Ramsey 2010年

5
+1好名单。但是,Objective-C也使用void*NULL,只是不用于对象。您可以在Obj-C中使用任何C风格的指针,并且许多API调用实际上是通过引用传递或返回值的,在这种情况下NULL经常使用。
奎因·泰勒

3
@wilhelmtell-我对objective-C一无所知,但是在C ++中,您可以动态地使一个不同的类对函数调用做出响应,但是您需要像指向基类的指针数组,然后是ACTUAL类这样的东西那是“悬而未决”的。尽管所有类都需要有子类,但方法调用会在运行时根据类调用不同的方法。
凯文·安德森

33

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

主要区别在于,Objective-C专注于调度的运行时决策,并且在很大程度上依赖于其运行时库来处理继承和多态性,而在C ++中,焦点通常集中在静态,编译时和决策上。

关于库,您可以使用两种语言的普通C库-但它们的本机库完全不同。

尽管有趣的是您可以混合使用两种语言(有一些限制)。结果称为Objective-C ++


更新的链接:Objective-C ++
IcyIcicle

6

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


6

从我的头顶上:

  1. 样式-Obj-C是动态的,C ++通常是静态的
  2. 尽管它们都是面向对象的,但我敢肯定解决方案会有所不同。
  3. 不同的对象模型(C ++受其编译时类型系统的限制)。

对我来说,最大的不同是模型系统。Obj-C允许您进行消息传递和自省,但是C ++具有功能如此强大的模板。

每个人都有自己的长处。


5

就像其他人所说的那样,Objective-C在对象方面的看法比C ++的相当静态的领域更具动态性。

在面向对象语言的Smalltalk家族中,Objective-C的对象概念与Java,Python和其他“标准”非C ++面向对象语言非常相似。大量的动态调度,没有操作员超载,发送消息。

C ++是它自己的怪异动物。它主要跳过了家谱的Smalltalk部分。在某些方面,它具有支持继承的良好模块系统,该继承恰好可以用于面向对象的编程。事情要静态得多(例如,可重写方法不是默认方法)。


4

Objective-C是C的更完美的超集。在C和Objective-C void*中,允许从隐式强制转换为struct指针。

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

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

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

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


第二个例子不是C ++代码。当您尝试使用C ++编译器进行编译时,这是C代码给您带来错误。如果您希望旧的C ++与原始C ++接近,Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));则可以编写代码,然后使用inplace构造函数。.直到今天,它的Modern C ++更像auto bar = new Foo(constructorArg);是实际上您不需要malloc,并且无论是用Callic还是都可以使用std::vector::reserve,以及std::vector::emplace_mack
xakepp35

3

Obj-C在语言本身中具有更多的动态功能,而C ++更侧重于具有某些动态功能的编译时功能。

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

Obj-C本质上是非常动态的。您可以在运行时将方法添加到类中。另外,它在运行时具有自省功能来查看类。在C ++中,类的定义不能更改,所有自省必须在编译时完成。尽管可以使用函数映射(或类似方法)在C ++中实现Obj-C的动态特性,但它比Obj-C更冗长。

在C ++中,在编译时可以进行更多检查。例如,使用变体类型(如并集),编译器可以强制所有情况都被编写或处理。因此,您不会忘记处理问题的极端情况。但是,所有这些检查都是在编译时付出代价的。Obj-C的编译速度比C ++快得多。


3
如果您要谈论价格,那就公平!相反,Obj-C在运行时解析动态方法调用的速度比C ++慢得多。而且我认为,与运行时速度相比,编译速度相对来说并不重要。我敢肯定,由于Obj-C具有更动态的调度功能,因此它可以带来很多好处,但是这里需要权衡取舍。
underscore_d

1
的确,运行时与编译时间成本之间需要权衡。但是,编译时间并不总是那么琐碎。在C ++中使用繁重的元编程和EDSL库(例如Boost.Spirit)会对编译时间产生巨大影响,同时在运行时生成非常快的代码。
Paul Fultz II

1
当然,相对于简单代码库的POV而言,我过于简化了。。。对于非常复杂的代码库,重新编译以测试较小的更改可能会使开发变得非常乏味,这并不是小菜一碟。但这是我们真正可以在两者之间进行比较的东西吗?这样依赖C ++编译时功能的库是否可以在Objective-C中以某种方式重新构想并显示出更快的编译速度?即语句“ Obj-C的编译速度比C ++快得多”是否指的是可以测量可复制速度的等效代码库?否则,我们将比较种植苹果和桔子所需的时间。
underscore_d
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.