Objective-C 与 C++ 的区别
一
下面总结一下 Objective-C 与 C++ 的区别:
1, 两者最大的相同便是: 都是从 C 演化而来的面向对象语言, 两者都兼容标准 C 语言.
2, 两者最大的不同便是: Objective C 提供了运行期动态绑定机制, 而 C++ 是编译时静态绑定, 并通过嵌入类(多重继承)和虚函数(虚表)来模拟实现. Objective C 在语言层次上支持动态消息转发, 其函数调用语法为 [object function], 而且C++ 为 object->function(). 两者的语义也有不同, 在 Objective C 里是说发送消息到一个对象上, 至于这个对象能不能处理消息(也就是说实现了这个函数与否)以及是处理还是转发消息都不会 crash, 而在 C++ 里是说对象进行了某个操作,如果对象没有这个操作的话,要么编译会报错(静态绑定),要么程序会 crash 掉的(动态绑定).
3, Objective C 不支持多重继承, 而 C++ 支持. 不过 Objective C 通过 proxy(代理) 和 Category(类别) 可以更优雅地实现这一特性. 这一点也包括了 overwriting(覆盖) 和 overloading(重载) 两者的不同.
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/free .
6, Objective-C 2.0 了加入了垃圾回收机制(在 iPhone 和 iPad 上不可用), 而 C++ 没有.
7, Objective-C 不允许在 Stack 上分配内存, 只能在 heap 上进行, 而 C++ 两者都允许.
8, Objective-C 不支持引用, 而 C++ 支持.
9, Objective-C 不支持模板, 而 C++ 支持.
10, Objective-C 是 Smalltalk 系的, 而 C++ 是 Simula 系的.
可以这么说 Objective-C 在 C 之上进行了一层简单的包装, 而 C++ 在 C++ 之上进行了复杂的包装, 但 Objective-C 让人感觉更优雅简洁.
二
#import<Foundation/Foundation.h>
@interface XYpoint :NSObject
{
int x;
int y;
}
- (XYpoint *)initWithX:(int) _xAndY:(int) _y;
- (void) getXValue;
- (void) getYValue;
- (void) setXValue:(int) _x;
- (void) setYValue:(int) _y;
@end
#import "XYpoint.h"
@implementation XYpoint
- (XYpoint *)initWithX:(int)_xAndY:(int)_y
{
if ([super init])
{
x = _x;
y = _y;
}
return self;
}
- (void) getXValue
{
NSLog(@"X value is %i",x);
}
- (void) getYValue
{
NSLog(@"Y value is %i",y);
}
- (void)setXValue:(int)_x
{
x = _x;
}
- (void)setYValue:(int)_y
{
y = _y;
}
@end
在这两个文件中,类的成员变量可以放在声明中也可以在实现程序里。
(2)函数的原型的不同
其实二者并没有多大本质的区别,只是需要加括号的部分相反而已。
在C/C++中,定义函数的方式为:返回类型 函数名称(参数类型 型参);而在oc中,定义函数的方式为:+/- (返回值类型)函数名称:(参数类型 型参)函数名称:(参数类型型参);
比如,在C/C++中,声明某个函数的如下:
void fun1(int nX1,int nX2);
同样的函数放到oc里就要这么写:
-(void) fun1:(int) nX1 And:(int) nX2;
也就是说,C/C++的函数,名称和参数基本上是分开的,而在OC中,参数表穿插在函数名称中间。在我看来,OC的这种命名函数的方式更能符合日常的语言习惯,函数同参数的意义也更容易理解。
(3)提供的开发框架
C++之中一个相当重要的部分便是标准模板库stl,在stl中提供了list/vector/set/map等容器还有针对不同数据结构的算法供开发者使用;在Objective-C中,同样存在foundationframework,提供了NSArray,NSString,NSSet等不同工具,但是从感觉上来看,Objective-C对foundationframework的依赖性比c++对stl的依赖性更强。
三
历史:
C:一九七八年由AT&T的贝尔实验室正式发表了C语言。后来由美国国家标准学会ANSI在此基础上制定了一个C语言标准,并于1983年发表,即为ANSI C。
C++:一九八三年又由贝尔实验室的Bjarne Strou-strup推出了C++。 C++进一步扩充和完善了C语言,成为一种面向对象的程序设计语言。
Objective -C:行内人简称其为OC。它的发展主要是因为1988年Steve Jobs的NextStep采用Objective-C作为开发语言,因此MacOS X以及IOS上的开发最佳语言自然也就是Objective-C了。同时Objective-C是苹果Mac OS X 上开发的首选语言,主要是因为Mac OS X 技术源自NextStep的OpenStep操作系统,因为OPENSTEP的软件架构(framework)都是用Objetive-C 写成。然后OC是由Brad Cox在80年代初在第一个纯面向对象语言Smalltalk基础上写成。Brod Cox创立了StepStone公司进行OC语言的推广。最终OC在1992年获得了GNU gcc编译器的支持,因此OC也是GNUstep在Linux和其他平台上的开发语言(GNUstep是什么,可以参考其官方网页http://www.gnustep.org/)。
特点:
1.作为一种结构化语言,层次清晰,便于按模块化方式组织程序,易于调试和维护;
2.表现能力和处理能力极强。可以直接访问内存的物理地址,进行位(bit)一级的操作;
3.C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体—既可用于系统软件的开发,也适合于应用软件的开发;
4.C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言(主要为演进成了后来的C++)。
1.在C语言的基础上进行扩充和完善,使C++兼容了C语言的面向过程特点,又成为了一种面向对象的程序设计语言;
1.Objecive-C属于Smalltalk学派,其面向对象与C++面向对象编程力的Simula 67(一种早期面向对象语言)学派不同;
3.Objective-C可以实现底层系统编程,另一方面可以支持利用动态架构进行开发。
C++与OC同为面向对象设计语言,他们有很多相似的对象,但是由于两者属于不同的面向对象学派。因此两者之间的比较也乐此不疲。下面简要说说他们的区别:
1.继承:Objective-C与同Java和Smalltalk一样不支持多重继承,而C++语言支持多重继承(从侧面可以说明多重继承的效率不高);
2.函数调用:Objective-C通过互相传递消息实现函数调用,而C++直接进行函数调用
4.接口:Objective-C采用protocol协议(非正式和正式)的形式来定义接口,而C++采用虚函数的形式来定义接口。
5.方法重载:c++中允许两个方法的名字相同,参数个数相同,但是参数类型不同,以及不同的返回值类型。而OC中不允许同一个类中两个方法有相同的名字,参数个数相同,参数类型不同。如下图XCode报错:
而C++是Static Typing语言,编译时会检查类型,所以必须要加上强制类型转换,否则编译器会报错。
Objective-C 与 C++区别是本文要结束的内容,主要是通过两者的区分学习,我们学习起来更方便些。不多说,我们来看详细内容。
1、两者最大的相同便是: 都是从 C 演化而来的面向对象语言, 两者都兼容标准 C 语言.
2、两者最大的不同便是: Objective C 提供了运行期动态绑定机制, 而C++ 是编译时静态绑定, 并通过嵌入类(多重继承)和虚函数(虚表)来模拟实现. Objective C 在语言层次上支持动态消息转发, 其函数调用语法为 [object function], 而且C++ 为 object->function(). 两者的语义也有不同,
在 Objective C 里是说发送消息到一个对象上, 至于这个对象能不能处理消息(也就是说实现了这个函数与否)以及是处理还是转发消息都不会 crash, 而在 C++ 里是说对象进行了某个操作,如果对象没有这个操作的话,要么编译会报错(静态绑定),要么程序会 crash 掉的(动态绑定).
3、Objective C 不支持多重继承, 而 C++ 支持. 不过 Objective C 通过 proxy(代理) 和 Category(类别) 可以更优雅地实现这一特性. 这一点也包括了 overwriting(覆盖) 和 overloading(重载) 两者的不同.
4、函数名字解析也不同, Objective C 的函数名字解析是函数名称 + 参数名称的, 而 C++ 只包括函数名称. 因此在 Objective C 中以下是合法的,因为两者解析出来分别类似于 foo:bar1 和 foo:bar2, 是不同的;
-(int)foo:(int) bar1; //原作者“Objective C 的函数名字解析是函数名称 + 参数名称”这里的参数名其实是指 “参数描述”,只有在两个以及两个以上的参数时才能有这么个意思。作者是直接将形参值的名字作为参数描述了,而且要说明这一点概念举例也不正确。
- -(char*)foo:(int) bar2;
(更正,原文对此的解释有错误,Objective-c 中没有重载,O-C只认函数名(包括参数描述))
要想实现类似重载的功能,只有先用NSNumber或者NSValue将参数装起来再作为参数,很笨的,不智能。
而在 C++ 中以下是非法的, 编译将出错, 因为两者解析出来都是类似于 foo:int, 编译器无法辨别.
- int foo(int bar1);
- char* foo(int bar2);
5、Objective-C 没有 C++ 里有的构造函数和析构函数, 其对应物为 alloc-init/free .
6、Objective-C 2.0 了加入了垃圾回收机制(在 iPhone 和 iPad 上不可用), 而 C++ 没有.
7、Objective-C 不允许在 Stack 上分配内存, 只能在 heap 上进行, 而 C++ 两者都允许.
8、Objective-C 不支持引用, 而 C++ 支持.
9、Objective-C 不支持模板, 而 C++ 支持.
10、Objective-C 是 Smalltalk 系的, 而 C++ 是 Simula 系的.
可以这么说 Objective-C 在 C 之上进行了一层简单的包装, 而 C++ 在 C++ 之上进行了复杂的包装, 但 Objective-C 让人感觉更优雅简洁
小结:详解Objective-C 与 C++区别的内容介绍完了,希望本文对你有所帮助!
Objective-C 与 C++ 的区别相关推荐
- xgboost objective和eval_metric的区别
之前对于xgboost中的两个参数objective和eval_metric一直分不清楚,不知道它们各自的作用.后来通过查找资料理清了他们之间的关系.这里记录一下. 1.objective objec ...
- Objective-C之MRC、ARC模式下,属性修饰关键字strong、retain、assign、weak的区别和联系...
平时用strong.retain.assign.weak这几个关键字的时候,也没有过多的在意,下边就MRC.ARC模式下,每个关键字做一下总结.为了简明期间,采用表格的形式进行展示. MRC ARC ...
- 损失函数(Loss function)、代价函数(成本函数)(Cost function)、目标函数(objective function)的区别与联系
基本概念: 损失函数(Loss function):计算的是一个样本的误差. 损失函数是定义在单个训练样本上的,也就是就算一个样本的误差,比如我们想要分类,就是预测的类别和实际类别的区别,是一个样本的 ...
- 结构体和类的区别 (objective c)
1. 结构体只能封装属性,而类不仅可以封装属性还可以封装方法. 如果1个封装数据既有属性也有行为,只能用类. 2. 结构体变量分配在栈.OC对象分配在堆. 栈的空间相对较 ...
- Objective C内存管理之理解autorelease------面试题
Objective C内存管理之理解autorelease Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Aut ...
- OC中protocol、category和继承的区别
利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"(OCP)的办法,也是最常见的一种方法.Objective C还支持另外两种语法来支持OCP:Protocol和Catego ...
- retain/copy/assign区别
转自:http://blog.csdn.net/pjk1129/article/details/6457048#comments 在iphone程序中,属性合成中的retain/copy/assign ...
- 面试题字符集和编码区别_您和理想工作之间的一件事-编码面试!
面试题字符集和编码区别 A recruiter calls you for a position with your dream company. You get extremely excited ...
- 高智商与低智商的区别_体内平衡与智力的定义
高智商与低智商的区别 Moravec's paradox is the observation made by AI researchers that high-level reasoning req ...
- one 主格 复数 宾格_主格和宾格的区别
展开全部 主格和宾格的区别在于: 在句子中,主格(the nominative case)用作主32313133353236313431303231363533e58685e5aeb931333365 ...
最新文章
- Ubuntu 8.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解
- 树莓派安装samba共享文件
- LRU缓存 数据结构设计(C++)
- opensips mysql 版本_Opensips-1.11版本安装过程
- 一个很小的 截图 库。 只需要依赖 jQuery
- Linu下安装ffmpeg
- 小芭比linux怎么装win7_超迷你的Linux系统--Puppy Linux(小芭比)
- Kaldi WFST HCLG.fst 构图 学习
- 金蝶服务器系统用什么,金蝶用哪个云服务器
- 微软推出经典进程监控工具 Procmon 的 Linux 版本
- php echo 后必须die,die 提示的消息都去哪了?
- 根据手机sim卡获取运营商信息
- 通俗易懂-SSM三大框架整合案例(SpringMVC+Spring+Mybatis)
- XiaoHu日志 11/22~12/3
- Invalid component name: “Home,“. Component names should conform to valid custom element。。。控制台报错
- 微型计算机的显卡,来看一款冷酷的游戏显卡,XFX讯景Radeon RX 6700XT海外版OC评测解析...
- 【Windows Server 2019】组策略的配置与管理——配置基于本地的组策略
- 数据可视化第二版-拓展-和鲸网约车分析一等奖作品
- python Object Oriented Programming
- CMMI3级认证和CMMI5认证有什么区别?