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

Ale*_*rty 166 c++ objective-c

Objective-C和C++在语法,功能,范例,框架和库方面有哪些主要区别?

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

Mac*_*Mac 180

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

  • C++允许多重继承,而Objective-C则不允许.
  • 与C++不同,Objective-C允许命名方法参数,方法签名仅包含参数的名称和类型以及返回类型(请参阅下面的bbum和Chuck的注释).相比之下,C++成员函数签名包含函数名称以及参数/返回的类型(没有它们的名称).
  • C++使用bool,truefalseObjective-C使用BOOL,YESNO.
  • C++使用void*nullptr,Objective-C更喜欢idnil.
  • Objective-C使用"选择器"(具有类型SEL)作为函数指针的近似等价物.
  • Objective-C使用消息传递范例(la Smalltalk),您可以通过方法/选择器向对象发送"消息".
  • nil与C++不同,Objective-C很乐意让你发送消息,如果你试图调用它的成员函数,它会崩溃nullptr
  • Objective-C允许动态分派,允许在运行时确定响应消息的类,不像C++,其中调用方法的对象必须在编译时知道(参见下面的wilhelmtell的注释).这与前一点有关.
  • Objective-C允许使用"属性"自动生成成员变量的访问器.
  • Objective-C允许分配self,并允许类初始化器(类似于构造函数)在需要时返回完全不同的类.与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++的名称修改.
  • Objective-C很乐意允许方法和变量共享相同的名称,这与通常具有适合性的C++不同.我想这与使用选择器而不是函数指针的Objective-C有关,因此方法名称实际上没有"值".
  • Objective-C不允许在堆栈上创建对象 - 必须从堆中分配所有对象(显式地使用alloc消息,或隐式地在适当的工厂方法中).
  • 与C++一样,Objective-C同时具有结构和类.但是,在C++中它们被视为几乎完全相同,在Objective-C中它们的处理方式大不相同 - 例如,您可以在堆栈上创建结构.

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

可能还有很多我错过的其他东西,我会更新我想到的任何其他事情.除此之外,可以强烈推荐LiraNuna指导您的指南.顺便说一下,另一个感兴趣的网站可能是这个.

我还应该指出,我自己刚开始学习Objective-C,因此上面的很多内容可能不太正确或完整 - 如果是这样的话,我道歉,并欢迎改进建议.

编辑:更新以解决以下评论中提出的要点,在列表中添加了一些项目.

  • @wilhelmtell:C++编译器在编译时只知道超类.在运行时,实际的类可以是任何后代.这也是动态调度的一种形式,但与Objective C中使用的形式不同.请注意这些技术术语! (9认同)
  • 体面清单; 一次纠正.它们不是"命名参数",而是"交错参数".命名和"关键字参数"导致混淆思考方法名称的某些子集可能被省略.这不可以. (8认同)
  • 您忘记了最重要的区别:Object-C使用动态分派,而C++使用静态分派.换句话说,由Objective-C编译器编译的代码将具有负责响应在运行时确定的消息的类; 由C++编译器编译的代码在编译时计算和编译此信息. (7认同)
  • +1好清单.但是,Objective-C也使用`void*`和`NULL`,而不是对象.您可以在Obj-C中使用任何C风格的指针,并且许多API调用实际上通过引用传递或返回值,在这种情况下经常使用"NULL". (5认同)
  • @wilhelmtell - 我不知道有关Objective-C的任何内容,但是在C++中你可以动态地让一个不同的类响应一个函数调用,但是你需要有类似指向基类的指针数组,然后是ACTUAL类.那是"悬挂"它的.虽然所有类都需要子类,但是方法调用将在运行时根据类调用不同的方法. (3认同)
  • @NikhilJJoshi:Obj-C不需要继承NSObject中的所有内容(例如NSProxy).您可以拥有自己的根类.委托也是一种可以用C++实现的设计模式.请参阅http://stackoverflow.com/questions/9568150/what-is-ac-delegate (3认同)
  • 稍微修正第二点:Objective-C中的方法名称称为**selector* - 方法*signature*指的是方法采用并返回的类型(例如,参见NSMethodSignature类). (2认同)
  • 1)C ++也可以具有命名参数。有关示例,请参见http://cpp-netlib.github.com/0.9.1/reference_http_server.html#constructor。2)通常,在c ++中对空指针调用方法不一定会发生段错误。访问成员变量时,大多数实现会出现段故障。 (2认同)
  • 在C++ 11之后,可以(并且通常建议)使用`nullptr`而不是`NULL`.据我所知,`NULL`只是一个0的宏,而`nullptr`会做一些类型检查来检查你是否指定了一个指针. (2认同)

Geo*_*che 32

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

一个主要的区别是Objective-C专注于调度的运行时决策,并且在很大程度上取决于它的运行时库来处理继承和多态,而在C++中,焦点通常在于静态,编译时,决策.

关于库,您可以在两种语言中使用纯C库 - 但它们的本机库完全不同.

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


Dea*_*ing 7

他们完全不同.Objective C与Smalltalk有比C++更多的共同点(嗯,除了语法,真的).


Rev*_*316 7

脱离我的头顶:

  1. 样式 - Obj-C是动态的,C++通常是静态的
  2. 虽然它们都是OOP,但我确信解决方案会有所不同.
  3. 不同的对象模型(C++受其编译时类型系统的限制).

对我来说,最大的区别是模型系统.Obj-C允许您进行消息传递和内省,但C++拥有功能强大的模板.

每个都有自己的长处.


Igo*_*aka 6

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

Foo* bar = malloc(sizeof(Foo));
Run Code Online (Sandbox Code Playgroud)

除非void显式转换指针,否则C++不会编译:

Foo* bar = (Foo*)malloc(sizeof(Foo));
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*and 6

正如其他人所说,Objective-C在如何看待对象与C++相当静态的领域方面更具动态性.

Objective-C是面向对象语言的Smalltalk系列,它具有与Java,Python和其他"标准"非C++面向对象语言非常相似的对象概念.大量的动态调度,没有运算符重载,发送消息.

C++是它自己奇怪的动物; 它主要跳过了家谱的Smalltalk部分.在某些方面,它有一个很好的模块系统,支持继承,恰好可以用于面向对象的编程.事物更加静态(例如,可覆盖的方法不是默认方法).