Objective-C 与 C++ 的异同
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 让人感觉更优雅简洁。
转自: 罗朝辉(http://www.cppblog.com/kesalin)
Objective-C 与 C++ 的异同的更多相关文章
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象
1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较 ...
- Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)
--reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...
- Atitit 会话层和表示层的异同
Atitit 会话层和表示层的异同 会话层 这一层也称为会晤层或对话层.在会话层及以上的更高层次中,数据传送的单位没有另外再取名字,一般都可称为报文. 会话层虽然不参与具体的数据传输,但它却对数据传输 ...
- Linux知识:/root/.bashrc与/etc/profile的异同
Linux知识:/root/.bashrc与/etc/profile的异同 要搞清bashrc与profile的区别,首先要弄明白什么是交互式shell和非交互式shell,什么是login shel ...
- Objective C中的ARC的修饰符的使用---- 学习笔记九
#import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...
- Shell 编程基础之 [ 与 [[ 的异同
一.简介 [ 与 test 等价,是 bash 的内部命令,GNU/linux 系统的 coreutils 软件包通常带 /usr/bin/test 和 /usr/bin/[ 命令.如果我们不用绝对路 ...
- Objective的字符串拼接 似乎没有Swift方便,但也可以制做一些较为方便的写法
NSString *str1 = @"字符串1"; NSString *str2 = @"字符串2"; //在同样条件下,Objective的字符串拼接 往往只 ...
- php empty,isset,is_null比较(差异与异同)
php empty,isset,is_null比较(差异与异同) http://www.cnblogs.com/chengmo/archive/2010/10/18/1854258.html
随机推荐
- bitcask
Bitcask模型是一种日志型kv模型.所谓日志型,是指它不直接支持随机写入,而是像日志一样支持追加操作.Bitcask模型将随机写入转化为顺序写入. 任意时刻,系统中只有一个数据文件支持写入,称为a ...
- 关于学习Knockoutjs--入门(二)
这两天终于闲一丢丢了,可以有多点时间学习一下拉.接下来要写到的还是Knockoutjs. Knockout是建立在以下3个核心功能之上的: 1. 属性监控与依赖跟踪 2. 声明式绑定 3. 模版机制 ...
- 为mongodb加用户授权并使用RockMongo进行管理
在刚安装完mongodb后是没有管理员的,如果要为mongodb设置管理员在启动时需要以用户授权的方式启动: /usr/local/webserver/mongodb/bin/mongod --dbp ...
- 删除已经配置的类库和移除CocoaPods[转]
转自:http://blog.csdn.net/jymn_chen/article/details/19213601 引言 在使用CocoaPods(一)为项目配置第三方类库我们使用CocoaPods ...
- @weakify, @strongify ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...
- SQL 四种基本数据操作语句的基本使用
SQL中含有四种基本的数据操作语句,分别是增(INSERT),删(DELETE),查(SELECT),改(UPDATE).下面简单介绍这四种语句的用法. 1:增(INSERT) 可分为两种查询情况,一 ...
- 【转】DQL、DML、DDL、DCL的概念与区别
转自 http://blog.csdn.net/tomatofly/article/details/5949070 SQL(Structure Query Language)语言是数据库的核心语言. ...
- 关于SQL Server 中连接查询Join的几种常见用法
现有A.B .C 三个表,A中的ID=B中的ID,B中的ID=C中的ID:也就是:A.ID=B.ID,B.ID=C.ID; 一. Inner Join 把两个表链接一起查 Select * from ...
- selenium高亮显示操作步骤方法
package com.allin.pc;import java.util.List;import org.openqa.selenium.WebElement;import org.openqa.s ...
- Cheatsheet: 2016 01.01 ~ 01.31
Mobile An Introduction to Cordova: Basics Web Angular 2 versus React: There Will Be Blood How to Bec ...