在语法、特性、范式、框架和库方面,Objective-C和C++有哪些主要区别?
*重要提示:我的目标不是引发两种语言之间的性能之争。我只想了解真正的硬性事实。实际上,我的问题与性能无关!请为任何可能看似主观的内容提供来源。
在语法、特性、范式、框架和库方面,Objective-C和C++有哪些主要区别?
*重要提示:我的目标不是引发两种语言之间的性能之争。我只想了解真正的硬性事实。实际上,我的问题与性能无关!请为任何可能看似主观的内容提供来源。
以下是一些重要的差异:
bool
、true
和false
,而Objective-C使用BOOL
、YES
和NO
。void*
和nullptr
,而Objective-C更喜欢使用id
和nil
。SEL
)作为函数指针的近似等价物。nil
发送消息,而C++如果您尝试调用nullptr
的成员函数则会崩溃。self
,并且允许类初始化器(类似于构造函数)在需要时返回完全不同的类。相比之下,在C++中,如果您创建了一个类的新实例(无论是隐式地在堆栈上还是通过new
显式创建),它保证是您最初指定的类型。int foo(void)
和int foo(int)
定义了方法foo
的隐式重载,但要在Objective-C中实现相同的功能需要显式重载 - (int)foo
和 - (int)foo:(int)intParam
。这是由于Objective-C的命名参数在功能上与C ++的名称修饰等效。alloc
消息显式分配,或者在适当的工厂方法中隐式分配)。我认为最大的区别可能是语法。您可以在任一语言中实现基本相同的功能,但在我的看法中,C ++语法更简单,而Objective-C的某些特性(例如动态调度)使得某些任务(如GUI设计)更容易。
也许还有其他一些我忽略了的事情,如果我想到任何其他事情,我会更新。除此之外,我强烈推荐LiraNuna为您指出的指南。顺便说一句,另一个感兴趣的网站可能是这个。
我还需要指出,我自己也刚开始学习Objective-C,因此上述内容可能不太正确或完整 - 如果情况是这样的,我很抱歉,并欢迎提出改进建议。
编辑:根据以下评论提出的要点更新,添加了几个项目到列表中。
void*
和NULL
,但并非用于对象。在Obj-C中,您可以使用任何C风格的指针,并且许多API调用实际上通过引用传递或返回值,在这种情况下经常使用NULL
。 - Quinn Taylor尽管它们都源于C语言,但它们是两种完全不同的语言。
一个主要区别是Objective-C侧重于运行时决策以进行派发,并且在继承和多态性方面严重依赖其运行时库,而在C++中通常侧重于静态、编译时的决策。
关于库,你可以在这两种语言中使用纯C库——但它们的本地库完全不同。
有趣的是,你可以混合使用两种语言(有一些限制)。结果被称为Objective-C++。
就我所知:
对我来说,最大的区别是模型系统。Obj-C允许您进行消息传递和内省,但C++具有强大的模板。
每个都有其优点。
它们完全不同。Objective-C与Smalltalk比与C++更有共同点(嗯,除了语法之外)。
Objective-C是C的一个更完美的超集。在C和Objective-C中,允许从 void*
隐式转换为结构体指针。
Foo* bar = malloc(sizeof(Foo));
如果不明确转换,C++ 将无法编译 void
指针:
Foo* bar = (Foo*)malloc(sizeof(Foo));
Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));
,然后可能使用就地构造函数。但是,从今天开始,现代C ++更像是auto bar = new Foo(constructorArg);
实际上您不需要malloc,也不需要callic,您可以使用std::vector::reserve
和std::vector::emplace_mack
。 - xakepp35Obj-C在语言本身具有更多的动态能力,而C++更专注于编译时能力并具有一些动态能力。
在C++中,参数化多态性在编译时进行检查,而在Obj-C中,参数化多态性是通过动态调度实现的,不会在编译时进行检查。
Obj-C非常具有动态性。您可以在运行时向类中添加方法。此外,它在运行时具有内省功能以查看类。在C++中,类的定义无法更改,并且必须在编译时完成所有内省。尽管可以使用函数映射(或类似内容)在C++中实现Obj-C的动态特性,但它仍比Obj-C更冗长。
在C++中,可以进行更多的编译时检查。例如,使用变体类型(如联合),编译器可以强制执行所有情况的编写或处理。因此,您不会忘记处理问题的边缘情况。但是,所有这些检查都会在编译时付出代价。Obj-C的编译速度比C++快得多。