罗朝辉(飘飘白云)

关注嵌入式操作系统,移动平台,图形开发。-->加微博 ^_^

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  85 随笔 :: 0 文章 :: 169 评论 :: 0 Trackbacks

Objective-C 与 C++ 的异同

罗朝辉(http://www.cppblog.com/kesalin

转载请注明出处


stackflow 上有同学提问"C++ 与 Objective-C 有什么异同?"楼下的提供的两个资料挺不错的.


其一是: Pierre Chatelier 写的 <From C++ to Objective-C version 2.1 en>

下载链接:http://pierre.chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf


其二便是: Michael Rutman 写的 C++ Versus Objective-C:

链接:http://www.mactech.com/articles/mactech/Vol.13/13.03/CandObjectiveCCompared/


下面总结一下 Objective-C 与 C++ 的区别:


1, 两者最大的相同便是: 都是从 C 演化而来的面向对象语言, 两者都兼容标准 C 语言.


2, 两者最大的不同便是: Objective C 是完全动态的,而 C++是部分动态的。
Objective C 支持在运行时动态类型决议(dynamic typing),动态绑定(dynamic binding)以及动态装载(dynamic loading);
C++ 是编译时静态绑定,通过嵌入类(多重继承)和虚函数(虚表)来模拟实现。
Objective C 在语言层次上支持动态消息转发,其消息发送语法为 [object function]; 而且C++ 为 object->function()。 两者的语义也不同,在 Objective C 里是说发送消息到一个对象上,至于这个对象能不能响应消息以及是响应还是转发消息都不会 crash; 而在 C++ 里是说对象进行了某个操作,如果对象没有这个操作的话,要么编译会报错(静态绑定),要么程序会 crash 掉的(动态绑定)。


3, Objective C 不支持多重继承, 而 C++ 支持。 不过 Objective C 通过 proxy(代理) 或 Category(类别) 可以更优雅地实现这一特性。这一点也包括了 overwriting(覆盖) 和 overloading(重载) 两者的不同。Objective C 不支持函数重载。


4, 函数名字解析也不同,Objective C 的函数名字解析是函数名称 + 参数名称的, 而 C++ 只包括函数名称。 因此在 Objective C 中以下是合法的,因为两者解析出来分别类似于 foo:bar1: 和 foo:bar2: 是不同的:

-(int)foo:(int) bar bar1:(int)bar;

-(char*)foo:(int) bar bar2:(int)bar;

而在 C++ 中以下是非法的, 编译将出错, 因为两者解析出来都是类似于 foo:int, 编译器无法辨别:

int foo(int bar, int bar1);

char* foo(int bar, int bar2);


5, Objective-C 没有 C++ 里有的构造函数和析构函数 其对应物为 alloc-init/dealloc;


6, Objective-C 2.0 了加入了垃圾回收机制(在 iPhone 和 iPad 上不可用) 而 C++ 没有;


7, Objective-C 不允许在 Stack 上分配内存,只能在 heap 上进行,而 C++ 两者都允许;


8, Objective-C 不支持模板而 C++ 支持;Objective-C 不支持命名空间,而 C++ 支持;Objective-C 也不支持函数缺省默认参数,而 C++ 支持;


10, Objective-C 是 Smalltalk 系的 而 C++ 是 Simula 系的。


可以这么说 Objective-C 在 C 之上进行了一层简洁的包装, 而 C++ 在 C++ 之上进行了复杂的包装, 但 Objective-C 让人感觉更优雅简洁。


posted on 2010-12-26 12:30 罗朝辉 阅读(10419) 评论(7)  编辑 收藏 引用 所属分类: 移动开发Cocoa 开发

评论

# re: Objective-C 与 C++ 的异同 2010-12-26 17:07 wu
-(int)foo:(int) bar1;
-(char*)foo:(int) bar2;

这两个是不同的吗?  回复  更多评论
  

# re: Objective-C 与 C++ 的异同 2010-12-27 09:53 rix
又见overwriting(覆盖) 和 overloading(重载),记得上一次看到是别人翻译国外的一篇文章看到的。国内很多人似乎一直把这两个混为一谈  回复  更多评论
  

# re: 【Apple】Objective-C 与 C++ 的异同 2011-06-09 22:42 罗朝辉
@wu

这两个是相同的,以下两个是不同的,原文中举例不当,已经修改过来了。

-(int)foo:(int) bar bar1:(int)bar;
-(char*)foo:(int) bar bar2:(int)bar;  回复  更多评论
  

# re: 【Apple】Objective-C 与 C++ 的异同 2011-06-24 17:55 D
@rix
Objective-c是可以overwriting现有class的一些selector的(不用生成新的class),C++貌似不行,除非继承 :)  回复  更多评论
  

# re: 【Apple】Objective-C 与 C++ 的异同 2011-08-30 04:18
没用过Objective C,不了解你说的overwriting,不过你把overloading和overriding已经给搞混了,看看你自己写的或者转贴的其它文章就知道了。

另外你对优雅的理解很肤浅。若以C为标准,无论是调用还是消息不过是语法糖罢了。不是说只能以C为标准,很多人(尤其是喜欢玩各种语言的)在这个问题上不理解,觉得动辄说C的都是只会C的菜鸟,其实真正有实践经验的就知道,二进制接口才是绝对的王,而现在最通用的二进制接口是C接口。而在接口背后,没有压根没有什么优雅不优雅的问题,只有基于需求的考虑外加口味问题。

而C++提供的模板则并非仅仅是糖,而是一种在保证约束的情况下进行的编译期自动化代码生成机制。这是一种质的不同。当然C++在语法糖相关的部分做的不是太到位,比如lambda是stateless的不能携带闭包等等,但最让人头痛的其实还是最终到C接口的转换所造成的工作量;倒不是说有多大,而是说这些都是无聊的繁文缛节。从根本上是因为C++的糖不是整体考虑的、而是一块一块粘起来的。

任何语言要想真正超越C++,需要的是运行期或运行前、编译后这个“期”进行代码自动生成的机制。这个.NET做了一部分,但出于M$的动机和大公司的局限性,也很不到位(甚至.NET下除了C++/CLI连编译期生成都是缺少要素的,比如特化等等)。

不是语言承载现实中的任务和项目,恰恰相反是现实中的任务和项目承载语言,因为无论是自然语言还是编程语言,它最大的价值来自于使用。所以虽然我也曾经很fan“优雅”一类的形容词,现在却很明白,谁说这些词,谁就是偏离了真正的航道,他们(至少在语言评价方面的)观点就不值一提。

不过,语言的缺陷确实真实的存在,但缺陷不是比较出来的,而是真正的设计缺陷,比如python 2.x中变量的作用域。恩又废话了,匿了。  回复  更多评论
  

# re: 【Apple】Objective-C 与 C++ 的异同 2011-08-30 13:39 罗朝辉
@呃

诚然,我是笔误了,将 overriding(重载) 写成 overwrting(重写,覆盖),但是没有将它们搞混:
override 一般是子类重写(覆盖)父类的方法,以实现与父类不同的行为;
overload 是重载,一般是用于在一个类里面实现若干同名但参数形式不同的重载方法,

我明白你的境地,C, C++, Obj-C 三种相比,C 无疑是最简洁,运行效率最高的;C++ 无疑是最复杂也很强大的;Obj-C 最优雅的,没有C++ 的复杂难以掌握,但也足够简洁高效,最重要的是易学易用。

都说学 C/C++ 的必有三个境界,C入门,唯C++,回归 C。但是在这后不妨再去了解了解其他的语言,Obj-C或动态语言。jjHou 总结过 C++ 就像是个熔炉,包括四种编程范式在里面。至于你说的模版并非仅仅是一直自动代码生成机制,它是完备的范型编程范式。

我不想在这里比较语言的优劣,也不想详谈 C++的大而全,复杂易误用等。C++ 以打补丁的形式增加了很多语法糖,无论是它的过去还是现在都说不上优雅。语言只是一种工具而已,在同样的应用环境下,哪一种语言能被更快,更容易地掌握,应用,推广,能让编程者所想即可所用,就足以证明它是优雅的。

你不妨去了解一下 Obj-C,讨论也需要有些背景知识的。

  回复  更多评论
  

# re: [Cocoa]Objective-C 与 C++ 的异同[未登录] 2012-06-16 01:33 1
至于这个对象能不能响应消息以及是响应还是转发消息都不会 crash

我看很多这么说,而实际呢,如果因为笔误写错一个方法调用立刻crash.  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理