小编典典

Objective-C 与 C++ 有何不同?

all

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

*重要提示:我的目标不是在两种语言之间引发性能战。我只想要真实的事实。事实上,我的问题与性能无关!请提供任何看似主观的东西的来源。


阅读 67

收藏
2022-08-15

共1个答案

小编典典

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

  • C++ 允许多重继承,Objective-C 不允许。
  • 与 C 不同,Objective-C 允许命名方法参数,并且方法签名仅包括参数的名称和类型以及返回类型(请参阅下面的 bbum 和 Chuck 的评论)。相比之下,C 成员函数签名包含函数名称以及参数/返回的类型(没有它们的名称)。
  • C++ 使用bool,truefalse, Objective-C 使用BOOL,YESNO.
  • C++ 使用void*and nullptr,Objective-C 更喜欢idand nil
  • Objective-C 使用“选择器”(具有 type SEL)作为函数指针的近似等价物。
  • Objective-C 使用消息传递范式(a la Smalltalk),您可以在其中通过方法/选择器向对象发送“消息”。
  • Objective-C 很乐意让你向 发送消息nil,不像 C++ 如果你尝试调用成员函数会崩溃nullptr
  • Objective-C 允许动态分派,允许在运行时确定响应消息的类,这与 C 不同,在 C 中调用方法的对象必须在编译时知道(参见下面 wilhelmtell 的评论)。 这与上一点有关。
  • Objective-C 允许使用“属性”为成员变量自动生成访问器。
  • Objective-C 允许分配给self,并允许类初始化器(类似于构造函数)在需要时返回完全不同的类。与 C++ 相比,如果您创建一个类的新实例(隐式地在堆栈上,或显式地通过new),它保证是您最初指定的类型。
  • 类似地,在 Objective-C 中,其他类也可以在运行时动态更改目标类以拦截方法调用。
  • Objective-C 缺乏 C++ 的命名空间特性。
  • Objective-C 缺少 C++ 引用的等价物。
  • Objective-C 缺乏模板,更喜欢(例如)允许在容器中进行弱类型化。
  • Objective-C 不允许隐式方法重载,但 C 允许。也就是说,在 Cint foo (void)定义int foo (int)了一个隐式重载的方法foo,但是在 Objective-C 中实现同样的方法需要显式重载- (int) foo- (int) foo:(int) intParam. 这是因为 Objective-C 的命名参数在功能上等同于 C++ 的名称修饰。
  • Objective-C 将很高兴地允许方法和变量共享相同的名称,不像 C++ 通常有合适的名称。我想这与使用选择器而不是函数指针的 Objective-C 有关,因此方法名称实际上没有“值”。
  • Objective-C 不允许在堆栈上创建对象 - 所有对象都必须从堆中分配(通过alloc消息显式分配,或在适当的工厂方法中隐式分配)。
  • 与 C 一样,Objective-C 既有结构也有类。然而,在 C 中,它们被视为几乎完全相同,而在 Objective-C 中,它们的处理方式截然不同——例如,您 可以 在堆栈上创建结构。

在我看来,最大的区别可能是语法。你可以用任何一种语言实现基本相同的东西,但在我看来,C++ 语法更简单,而 Objective-C
的一些特性通过动态调度使某些任务(如 GUI 设计)更容易。

可能还有很多我错过的其他事情,我会更新我想到的任何其他事情。除此之外,可以强烈推荐 LiraNuna
为您指出的指南。顺便说一句,另一个感兴趣的站点可能是this

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

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

2022-08-15