7

我已经学习 C++ 几个月了,发现它是一门优秀的语言,尽管它有好处。

我想知道所谓的Objective-C++到底是什么,是否值得学习它作为针对 Apple 环境(即 Mac OS X、iPhone OS)的主要开发语言。在网上搜索我只找到了几篇好文章:主要是Wikipedia 的条目Mac Dev Center的一篇。

维基百科说:

Objective-C++ 是 GNU Compiler Collection 的前端,它可以编译使用 C++ 和 Objective-C 语法组合的源文件。Objective-C++ 向 C++ 添加了 Objective-C 对 C 的扩展。

Mac 开发中心文章补充说:

Apple 的 Objective-C 编译器允许您在同一个源文件中自由混合 C++ 和 Objective-C 代码。这种 Objective-C/C++ 混合语言称为 Objective-C++。有了它,您可以利用 Objective-C 应用程序中现有的 C++ 库。

Apple 文章称 Objective-C++ 是一种语言。这是正确的吗?

我想知道以下内容:

  • 在不了解 C/Objective-C 的情况下,是否可以学习和使用 Objective-C++?
  • 是否有任何可以获取更多信息和/或帮助的好书、网站、论坛等?
  • 据你所知,有没有用 Objective-C++ 完成的大项目?
4

5 回答 5

8

Objective-C++ 实际上只是将 Objective-C 与 C++ 混合在一起。由于它允许两者的语法,因此您可以争辩说它是一种新语言。

当我必须将 Objective-C 代码与一些 C++ 库接口时,我主要使用 ObjC++(.mm 源文件)。在这种情况下能够调用 C++ 很方便。就我个人而言,我不知道有多少人真正将 C++ 和 Objective-C 混合在一起。

于 2010-01-22T12:51:01.600 回答
8

是的,当您想开发具有竞争力的商业实力(也就是人们愿意为它们付费)Apple 应用程序时,您应该学习 Objective-C++。

将 Objective-C 和 C++ 组合在同一个文件中确实不是别的。

对于 Objective-C,使用流行的苹果开发博客/邮件列表/新闻组中的任何一个。尤其是苹果直接提供的那种。

对于 C++ 也是如此,那里有几十个博客/邮件列表/入门教程。但是,如果您已经了解编程,那么 C 及其 Objective-C 附加组件非常简单易学。C++ 是一个完全不同且复杂的野兽。买几本好书并学习它(10 年后你将能够完全理解这门语言:-),但是你可以用这些知识的一小部分编写 C++ 程序。

所以现在出现了一个神奇的问题,为什么在可以摆脱 Objective-C 的情况下使用 C++。答案很简单。除了明显提到的现有 C++ 库的包装之外,Objective-C 很慢,首先是方法调用。通常的建议是在你的方法中做一些严肃的事情,以避免这种语言中出现的这种运行时惩罚。

但特别是对于容器,您应该真正考虑使用 C++ 模板。向量比 NSArray 快得多。如果你的数据集很大,你会感觉到不同。我还发现 C++ 容器更易于使用,因为它们避免了与 Objective-C 相关的类型转换。

对于 iPad 和 iPhone 上的慢速 ARM CPU,这并不是过早的优化。

不幸的是,您不能混合使用 C++ 和 Cocoa 类,因此 C++ 只能用于算法数据。对于 GUI,您必须使用 Cocoa 和 Objective-C 类。

在 C++ 和 Objective-C 之间取得适当的平衡是您作为 Apple 程序员需要开发的部分技能。

于 2010-02-06T05:37:13.600 回答
2

目标-C++

Objective-C 是对 ANSI C 的一小组扩展。Objective-C++与应用于 C++ 的扩展集相同。Apple 的 Objective-C 编译器也是一个 Objective-C++ 编译器。

Objective-C 的优点之一是,作为 ANSI C 的超集,它可以很容易地与世界上数百万行现有的 C 代码混合。Objective-C++ 可以与已经存在的数百万行 C++ 代码混合。Objective-C++ 完全支持 C++ 功能,例如名称修改,因此 Objective-C++ 代码和现有 C++ 代码之间的直接链接是可能的。

Objective-C 源代码文件由 .m 扩展名标识。Apple 的编译器将扩​​展名为 .M 或 .mm 的文件视为 Objective-C++ 源代码。此外,–x 编译器选项可用于指示 Apple 的编译器将任何输入文件视为 Objective-C++ 源代码。

Apple 的在线文档在http://developer.apple.com/techpubs/上描述了 Objective-C++ 的特性和限制,以及 Apple 开发人员工具随附的发行说明中。通常,Objective-C 类和 C++ 类可以混合使用,以便 Objective-C 方法可以调用 C++ 成员函数,反之亦然,或者 C++ 类可以包含指向 Objective-C 对象的指针作为成员变量。Objective-C 类不能从 C++ 类或其他方式继承。两个类层次结构必须保持不同。C++ 和 Objective-C 之间关于实例创建和删除的语义有很大的不同。因此,混合它们可能很棘手,但在新的 Objective-C 项目中重用现有 C++ 代码的好处超过了它引入的复杂性。

关于 Objective-C++ 的一些更实用的点

Gcc 同时是 C、Objective-C 和 C++ 的编译器。您可以在某种程度上混合 C++ 和 Objective-C 代码。要指示编译器文件包含 C++ 代码以及 Objective-C,请使用文件扩展名 .mm 或 .M 而不是 .m。

以下是可以一起使用 C++ 和 Objective-C 代码的一些方法:

  1. Objective-C 对象可以具有指向 C++ 对象的字段,反之亦然。

  2. Objective-C 代码可以调用 C++ 对象的方法,反之亦然。

  3. Objective-C 对象可以将 C++ 对象(相对于指针)作为字段,但前提是 C++ 类没有虚拟方法。

然而,Objective-C 和 C++ 并不完全兼容。以下是一些你不能做的事情:

  1. Objective-C 类不能从 C++ 类继承,反之亦然。

  2. 您不能在 C++ 命名空间或模板中声明 Objective-C 类,反之亦然。

  3. 您不能对变量名使用C++关键字。Objective-C

  4. 您不能Objective-C使用语法调用方法,C++反之亦然。

最后,为了避免歧义,还施加了一些限制:

  1. 您不能将名称 id 用作 C++ 模板名称。如果可以,声明 id< TypeName > var 可以是 C++ 模板声明或使用协议的 Objective-C 声明。

  2. 如果要将全局范围的 C++ 变量传递给 Objective-C 方法,则需要在第一个和第二个冒号之间留一个空格。

您可能会发现这些链接很有帮助:-

  1. https://www.raywenderlich.com/62989/introduction-c-ios-developers-part-1

  2. https://www.raywenderlich.com/62990/introduction-c-ios-developers-part-2

  3. https://www.sitepoint.com/using-c-and-c-in-an-ios-app-with-objective-c/

  4. https://github.com/sitepoint-editors/HelloCpp

于 2017-05-04T11:35:39.267 回答
1

1)我对此表示怀疑,因为他们每个人都是 C 语言的超集。我不认为objective-c++ 是一种全新的语言。它只是两者的结合,为您提供了一些额外的可能性 - 即重用现有的 c++ 代码,或者在更多时间关键的代码部分使用更快的 c++,或者使用没有暴露 Objective-c / cocoa 接口的 c++ 代码(主要是硬件相关的低级串行端口/ ioctls、opengl、...之类的东西

2)我认为有关此主题的资源

3)通过......我的意思是你认为什么大。我只是从一堆项目中知道的(也许不是所有的项目都是商业的,因为你可以在商店中购买软件)出于 1 中列出的原因使用这种组合。

于 2010-01-22T13:38:18.750 回答
0

许多大型项目使用一些 Objective-C++。例如,Camino、Chromium 和 Firefox 都是包含 Objective-C++ 的重要开源项目。

于 2010-01-22T15:30:19.517 回答