在语法,功能,范例,框架和库方面,Objective-C和C ++之间的主要区别是什么?
*重要:我的目标不是在两种语言之间展开性能大战。我只想要真实的事实。实际上,我的问题与性能无关!请提供任何看似主观的信息。
在语法,功能,范例,框架和库方面,Objective-C和C ++之间的主要区别是什么?
*重要:我的目标不是在两种语言之间展开性能大战。我只想要真实的事实。实际上,我的问题与性能无关!请提供任何看似主观的信息。
Answers:
一些主要差异的简短列表:
bool
,true
以及false
,Objective-C中的用途BOOL
,YES
和NO
。void*
and nullptr
,而Objective-C则首选id
and nil
。SEL
)近似等效于函数指针。nil
与C ++不同,Objective-C会让您愉快地向发送消息到C ++,如果您尝试调用的成员函数,C ++将会崩溃nullptr
self
,并允许类初始化程序(类似于构造函数)在需要时返回完全不同的类。与C ++相反,在C ++中,如果您创建类的新实例(隐式地在堆栈上,或通过显式地new
),则可以保证它是您最初指定的类型。int foo (void)
和int foo (int)
定义该方法的一个隐式过载foo
,但要达到相同的目标C需要明确的重载- (int) foo
和- (int) foo:(int) intParam
。这是由于Objective-C的命名参数在功能上等同于C ++的名称处理。alloc
消息显式分配,或在适当的工厂方法中隐式分配)。我认为,最大的不同可能是语法。您可以用两种语言实现基本相同的事情,但是我认为C ++语法更简单,而Objective-C的某些功能由于动态分配而使某些任务(例如GUI设计)更容易。
我可能还错过了许多其他事情,我将用我想到的其他任何事情进行更新。除此之外,可以强烈推荐LiraNuna指向您的指南。顺便说一句,另一个感兴趣的站点可能是this。
我还应该指出,我本人只是开始学习Objective-C,因此上述内容可能并不完全正确或不完整-如果是这种情况,我深表歉意,并欢迎提出改进建议。
编辑:更新以解决以下评论中提出的要点,将更多项目添加到列表中。
void*
和NULL
,只是不用于对象。您可以在Obj-C中使用任何C风格的指针,并且许多API调用实际上是通过引用传递或返回值的,在这种情况下NULL
经常使用。
它们都植根于C语言,但它们是两种完全不同的语言。
主要区别在于,Objective-C专注于调度的运行时决策,并且在很大程度上依赖于其运行时库来处理继承和多态性,而在C ++中,焦点通常集中在静态,编译时和决策上。
关于库,您可以使用两种语言的普通C库-但它们的本机库完全不同。
尽管有趣的是您可以混合使用两种语言(有一些限制)。结果称为Objective-C ++。
就像其他人所说的那样,Objective-C在对象方面的看法比C ++的相当静态的领域更具动态性。
在面向对象语言的Smalltalk家族中,Objective-C的对象概念与Java,Python和其他“标准”非C ++面向对象语言非常相似。大量的动态调度,没有操作员超载,发送消息。
C ++是它自己的怪异动物。它主要跳过了家谱的Smalltalk部分。在某些方面,它具有支持继承的良好模块系统,该继承恰好可以用于面向对象的编程。事情要静态得多(例如,可重写方法不是默认方法)。
Objective-C是C的更完美的超集。在C和Objective-C void*
中,允许从隐式强制转换为struct指针。
Foo* bar = malloc(sizeof(Foo));
除非void
明确转换指针,否则C ++将不会编译:
Foo* bar = (Foo*)malloc(sizeof(Foo));
这与每天编程的相关性为零,这只是一个有趣的琐事。
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
Obj-C在语言本身中具有更多的动态功能,而C ++更侧重于具有某些动态功能的编译时功能。
在其中,C ++参数多态性是在编译时检查的,而在Obj-C中,参数多态性是通过动态调度实现的,而不在编译时检查。
Obj-C本质上是非常动态的。您可以在运行时将方法添加到类中。另外,它在运行时具有自省功能来查看类。在C ++中,类的定义不能更改,所有自省必须在编译时完成。尽管可以使用函数映射(或类似方法)在C ++中实现Obj-C的动态特性,但它比Obj-C更冗长。
在C ++中,在编译时可以进行更多检查。例如,使用变体类型(如并集),编译器可以强制所有情况都被编写或处理。因此,您不会忘记处理问题的极端情况。但是,所有这些检查都是在编译时付出代价的。Obj-C的编译速度比C ++快得多。