C、C++、Objective-C区别

历史渊源

C的诞生

1978年,贝尔实验室正式发表了C语言,后来由美国国家标准学会ANSI在此基础上制定了C语言标准,并与1983年发布,即为ANSI C。

C++的诞生

1983年,贝尔实验室又推出了C++。C++进一步扩充和完善了C语言。成了一种蛮像对象的程序设计语言。

Objective-C的诞生

它的发展主要是因为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/)。

语言特点

C:

  1. 作为一种结构化语言、层次清晰,便于按模块化方式组织程序,易于调试和维护;
  2. 表现能力和处理能力极强。可以直接访问内存的物理地址,进行位(bit)一级的操作;
  3. C语言实现了对硬件的编程操作,因为C语言集高级语言和低级语言的功能于一体即可以用于系统软件的开发,也适用于应用软件的开发;
  4. C语言还有效率高,可移植性强等特点。因此广泛地移植到了各类型计算机上,从而形成了多种版本的C语言。(主要为演进成了后来的C++)

C++:

  1. 在C的基础上进行了扩展和完善,使C++兼容了C语言的面向过程特点,又成了一种面向对象的程序设计语言。
  2. 可以使用抽象数据类型进行基于对象的编程。
  3. 可以使用多继承、多态进行面向对象的编程。
  4. 可以担负起以模板为特征的泛型化编程

Objective-C:(OC )

  1. OC是C的超集,扩展了C语言使它具备面向对象设计的能力。例如类、消息、继承;同时在OC的代码中可以有C和C++语句,它可以调用C的函数,也可以通过C++对象访问方法;
  2. OC不同于C++,尽管都有面向对象的能力,但他们分属不同的学派,OC属于SmallTalk学派,C++属于Simula 67学派(一种早期的面向对象语言)。
  3. OC可以底层系统编程,另一方面可以支持利用动态架构进行开发。

OC于C++的比较:

两者都是面向对象设计语言,有很多相似之处,但属于不同的学派,也有不同之处:

  1. 继承:OC不支持多继承,C++支持多继承
  2. 函数调用:OC通过传递消息实现函数调用,而C++直接进行函数调用
  3. 定型:OC是动态定型,所以它的类库比C++容易操作。OC在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类。而C++,对象的静态类型决定你是否可以发消息给它。
  4. 接口:OC采用协议(正式和非正式)的形式来定义接口,而C++采用虚函数的形式来定义接口
  5. 方法重载:OC不支持方法重载,C++支持方法重载。方法重载就是方法名相同,参数个数相同,但是参数类型不同或者返回值类型不同。

两者的主要差别是因为OC既支持动态类型也支持静态类型。对于id类型的变量,变量只是一个容器,本身是没有类型的,或者知识属于最基本的类型,所以也不需要强制类型转换。因为编译器不会对检查变量类型是否正确,只是运行时如果类型不正确会才会产生异常。

而C++是静态语言,编译时会检查类型,所以必须要加上强制类型转换,否则编译器就会报错。

编译时的不同

OC:虽然Objective-C具备动态类型的能力,但编译期的静态类型检查依旧可以应用到变量上。附加的类型信息让编译器在编译时可以检查变量类型,并对类型不符的变量提出警告。

C++: 编译要求严格

OC如何实现多继承

Objective-C在NeXT时期曾经试图引入多重继承的概念,但由于协议的出现而没有实现之。

协议类似于Java与C#语言中的“接口”。在Objective-C中,有两种定义协议的方式:由编译器保证的“正式协议”,以及为特定目的设定的“非正式协议”。

非正式协议为一个可以选择性实现的一系列方法列表。非正式协议虽名为协议,但实际上是挂于NSObject上的未实现分类(Unimplemented Category)的一种称谓,Objetive-C语言机制上并没有非正式协议这种东西,OSX 10.6版本之后由于引入@optional关键字,使得正式协议已具备同样的能力,所以非正式协议已经被废弃不再使用。

正式协议类似于Java中的"接口",它是一系列方法的列表,任何类都可以声明自身实现了某个协议。在Objective-C 2.0之前,一个类必须实现它声明匹配的协议中的所有方法,否则编译器会报告错误,表明这个类没有实现它声明匹配的协议中的全部方法。Objective-C 2.0版本允许标记协议中某些方法为可选的(Optional),这样编译器就不会强制实现这些可选的方法。

常用的有使用协议和类别实现多继承。

OC中可以使用以下方式实现多继承:

  1. 协议
  2. 类别
  3. 消息转发
  4. 强制转换
  5. 组合模式

深入剖析 iOS 编译 Clang LLVM

参考资料:

http://blog.csdn.net/dqjyong/article/details/7663866

https://zh.wikipedia.org/wiki/Objective-C

http://www.jianshu.com/p/d9b213af4d8a

你可能感兴趣的:(C、C++、Objective-C区别)