1.C与OC、C++的区别:

C语言的特点:面向过程

1)C语言是结构化语言,层次清晰,调试和维护比较容易

2)表现能力和处理能力比较强,可直接访问内存的物理地址

3)c语言实现对硬件的编辑,c语言课用语系统软件的开发,也可用语应用软件的开发,是集高级语言和低级语言的功能一体。

4)C语言效率高,可移植性强。

C++语言特点:面向过程又面向对象

1、在C语言的基础上进行扩充和完善,使C++兼容了C语言的面向过程特点,又成为了一种面向对象的程序设计语言;

2、可以使用抽象数据类型进行基于对象的编程;

3、可以使用多继承、多态进行面向对象的编程;

4、可以担负起以模版为特征的泛型化编程。

OC的特点:面向对象

1、Objective-C,扩展了C 语言使它具备面向对象设计的能力,例如类、消息、继承;同时在Objective-C的代码中可以有C和C++语句,它可以调用C的函数,也可以通过C++对象访问方法;

2、Objective-C可以实现底层系统编程,另一方面可以支持利用动态架构进行开发。

OC与C语言的区别:

OC里中兼容C语言的语法可以两者混合编码。 OC是面向对象的,有类,对象的概念,C语言没有类,对象的概念;C是面向过程的语言。

OC的和C++的区别:

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

最大不同便是:Objective C 提供了运行期动态绑定机制, 而C++ 是编译时静态绑定, 并通过嵌入类(多重继承)和虚函数(虚表)来模拟实现. Objective C 在语言层次上支持动态消息转发, 其函数调用语法为 [object function], 而且C++ 为 object->function(). 两者的语义也有不同,在 Objective C 里是说发送消息到一个对象上, 至于这个对象能不能处理消息(也就是说实现了这个函数与否)以及是处理还是转发消息都不会 crash, 而在 C++ 里是说对象进行了某个操作,如果对象没有这个操作的话,要么编译会报错(静态绑定),要么程序会 crash 掉的(动态绑定).

1、继承:Objective-C不支持多重继承,不过 Objective C 通过 proxy(代理) 和 Category(类别) 可以更优雅地实现这一特性,而C++语言支持多重继承(从侧面可以说明多重继承的效率不高);

2、函数调用:Objective-C通过互相传递消息实现函数调用,而C++直接进行函数调用

3、函数名字解析: Objective C 的函数名字解析是函数名称 + 参数名称的, 而 C++ 只包括函数名称.

4、定型:Objective-C是动态定型。所以它的类库比C++要容易操作。Objective-C 在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类。而C++,对象的静态类型决定你是否可以发送消息给它。

5、接口:Objective-C采用protocol协议(非正式和正式)的形式来定义接口,而C++采用虚函数的形式来定义接口。

6、方法重载:c++中允许两个方法的名字相同,参数个数相同,但是参数类型不同,以及不同的返回值类型。而OC中不允许同一个类中两个方法有相同的名字,参数个数相同,参数类型不同。

7、Objective-C 没有 C++ 里有的构造函数和析构函数, 其对应物为 alloc-init/free .

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

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

10、Objective-C 不支持引用, 而 C++ 支持.

11、Objective-C 不支持模板, 而 C++ 支持.

12、Objective-C 是 Smalltalk 系的, 而 C++ 是 Simula 系的.

2.OC的动态特性

1)动态类型

即运行时再决定对象的类型;

2)动态绑定

基于动态类型,在某个实例对象被确定后,其类型便被确定了。该对象对应的属性和响应的消息也被完全确定,这就是动态绑定。在继续之前,需要明确Objective-C中消息的概念。由于OC的动态特性,在OC中其实很少提及“函数”的概念,传统的函数一般在编译时就已经把参数信息和函数实现打包到编译后的源码中了,而在OC中最常使用的是消息机制。调用一个实例的方法,所做的是向该实例的指针发送消息,实例在收到消息后,从自身的实现中寻找响应这条消息的方法。动态绑定所做的,即是在实例所属类确定后,将某些属性和相应的方法(原来没有在类中实现的,而是在运行时才需要新加入的实现)绑定到实例上。在Cocoa层,我们一般向一个NSObject对象发送-respondsToSelector:或者-instancesRespondToSelector:等来确定对象是否可以对某个SEL做出响应,而在OC消息转发机制被触发之前,对应的类的+resolveClassMethod:和+resolveInstanceMethod:将会被调用,在此时可以动态地向类或者实例添加新的方法,也即类的实现是可以动态绑定的。

3)动态加载

根据需求加载所需要的资源。

4.OC的消息机制

oc是一门动态语言,对象调用方法被称为给对象发送消息。

消息机制深入理解:

1>Objective-C是一门动态语言,其动态特性很大程度上是归因于其消息机制。

2>Objective-C采用了消息发送、消息选择器、动态类型和运行时检查等机制。

3>消息选择器

1、方法和选择器:

在OC中,selector有两重含义:一是在源代码中它代表了向对象发送消息的方法名称;二是在编译后它代表了方法名称被编译过后一个统一的标识。

编译后的方法名称有一个类型名称为SEL,所有的同名方法都共享同一个selector。 一定要注意:方法名称和方法不是一个东西。方法是method,类型是IMP,类似C语言的函数,是指对象的一段可运行的代码。  而方法名称是selector,类型是SEL,是给方法取得名字,不同的类的同名方法共享一个方法名称的编号。 (采用选择器体现了OC的多态性和动态绑定性)

2、要使用动态绑定,同名的方法必须采用同样的参数类型和返回类型。

_cmd是什么?  _cmd表示当前方法的selector,可以赋值给SEL类型的变量,可以作为参数传递。

3、运行时改变消息:在NSObject协议中定义了performSelector:方法,它起到的作用和直接调用方法是一样的,但是由于performSelector:的参数是可以替换的,因此容许在运行时改变消息。

4、Target-Action模式:

target是一个指向其它对象的指针,action是会发给target的消息。例如:[button addTarget:anObjectaction:angelforControlEvents:UIControlEventTouchUpInside]

5、获取方法的地址:

OC专门定义了一种类型IMP,可以通过IMP来获取方法地址:例如:IMP = impStudy = [student methodForSelector:@selector(study)]; 其实IMP是一个函数指针,他的定义式:typedef id (*IMP) (id, SEL, …); 这个函数有两个以上的参数,第一个是运行该函数的对象,第二个是对象的方法名,后面是这个方法所带的参数。我们可以如下调用:impStudy(student, @selector(study)); // 这个语句和[student study];的作用是一样的,区别在于使用函数指针是直接调用方法的地址,更快一点。而使用[student study];要先给student对象发送study消息,然后运行系统会去寻找消息对应的名称,再找到方法的地址,然后去运行,效率会低一点。

6、容许静态行为:OC是一门动态语言,有很大的灵活性和优点,但是也会带来一些不好的地方,有时候我们需要暂时屏蔽其动态特性。

默认的动态行为:

对象的内存空间是动态申请的,由运行时刻的类方法来创建对象实例。

对象都是动态类型的。在编译时期的源代码中,对象可以是id类型的,运行时才确定具体的类(从而确定其方法和数据结构)。 消息和方法也是动态绑定的。运行时系统会将消息中的消息选择器与消息接受者的方法进行匹配。

7、静态类型

在定义变量的时候如果我们不使用id,而使用具体的某一类的名称,我们称为静态类型:例如:id person; // 动态类型    Student *stu; // 静态类型

静态类型给了编译器有关对象更多的信息,相比单纯的采用id类型,有以下不同点:1.容许编译期间进行类型检查 2.使代码更具可读性 3.静态类型的对象不用遵循“同名的方法必须具备同样的参数和返回值”的规则 4.可以通过结构体指针直接访问对象的实例变量

8、运行时消息检查:

当对象接收到一条它无法实现的消息的时候,会产生错误。因为消息是在运行时刻才发出。我们可以用respondsToSelector:方法来检测一个对象时候能响应某条消息。

9、消息传递:

有两个对象A、B,当给A发送一条消息,但是A无法处理的时候它会不会传递给B对象呢?答案是肯定的。

在添加消息转发功能前,必须要覆盖两个方法:methodSignatureForSelector: // 为另一个类实现消息创建一个有效的方法签名forwardInvocation: // 将选择器转发给一个真正实现该消息的对象。

C,OC,C++语言对比的更多相关文章

  1. 【转】浅思OC的语言特性

    算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...

  2. 浅思OC的语言特性

    算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...

  3. MATLAB与C语言对比实例:随机数生成

    MATLAB与C语言对比实例:随机数生成 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.整型随机数生成函数 1.C语言程序 int intrand ...

  4. 02:OC和C对比

    1.源文件对比 C语言中常见源文件.h头文件,.c文件 文件扩展名 源类型 .h 头文件,用于存放函数声明 .c C语言源文件,用于实现头文件中声明的方法 OC中的源文件.h头文件,.m与.mm的实现 ...

  5. OC和C对比

    1.源文件对比 C语言中常见源文件.h头文件,.c文件 文件扩展名 源类型 .h 头文件,用于存放函数声明 .c C语言源文件,用于实现头文件中声明的方法 OC中的源文件.h头文件,.m与.mm的实现 ...

  6. 嵌入式&iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

  7. Objective-C 再谈OC指针,对比C++/Java/Swift

    1.Objective-C的指针 OC一直是人感觉比较变态的一门语言,为什么呢?因为它的每个变量都是指针型,多的都几乎让人忘了那个*的存在了. 比如我定义了一个Student的Class,new了st ...

  8. JAVA语言对比C++语言的几个优点和自身的关键特性

    之所以写这篇博客不是为了比较JAVA语言和C++语言到底孰优孰劣,而是从语言本身出发进行对比总结程序编码设计上的差别.因水平有限,某些内容可能太过片面,欢迎指正和讨论. JAVA语言在设计上很好地借鉴 ...

  9. 命令式语言和声明式语言对比——JavaScript实现快速排序为例

    什么是命令式编程 (Imperative Programming)? 命令机器如何做事情,强调细节实现 java.c.c++等都属此类. “这些语言的特征在于,写出的代码除了表现出“什么(What)” ...

随机推荐

  1. springboot项目对接支付宝支付

    支付宝对接文档 一.准备工作 1. 首先要到 蚂蚁金服开发者中心 https://openhome.alipay.com/platform/home.htm 注册商家账户,并认证. 2.下载java版 ...

  2. C# TreeView 右键菜单

    方法一: 在winform中,添加一个contextMenuStrip1,设置TreeView的属性ContextMenuStrip为contextMenuStrip1,并为这个contextMenu ...

  3. AtCoder NIKKEI Programming Contest 2019 C. Different Strokes (贪心)

    题目链接:https://nikkei2019-qual.contest.atcoder.jp/tasks/nikkei2019_qual_C 题意:给出 n 种食物,Takahashi 吃下获得 a ...

  4. 02-Elenment 引入使用

    快速上手 本节将介绍如何在项目中使用 Element. ¶使用 vue-cli@3 我们为新版的 vue-cli 准备了相应的 Element 插件,你可以用它们快速地搭建一个基于 Element 的 ...

  5. learning scala pattern matching

    code: package com.aura.scala.day01 import scala.util.Random object patternMatching01 { def main(args ...

  6. spring boot 扫描 其他jar包里面的 mapper xml

    启动类配置扫描 goods.mapper为当前项目mapper路径 ,common.mpper为其他jar包. 1. 2.mybatis.mapper-locations=classpath*:map ...

  7. 使用Ajax和一般处理程序实现文件上传与下载

    1.使用HTML的input标签 <input type="file" multiple="multiple" id="file_load&qu ...

  8. pandas 筛选某一列最大值最小值 sort_values、groupby、max、min

    高效方法: dfs[dfs['delta'].isnull()==False].sort_values(by='delta', ascending=True).groupby('Call_Number ...

  9. ROS手动编写服务端和客户端service demo(C++)

    service demo 原理和 topic 通信方式很像 点击打开链接,因此 1.srv : 进入 service_demo 创建 srv 文件夹,创建 Greeting.srv,将以下代码插入: ...

  10. Python3 输入和输出(一)

    1.输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数. 第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用. 如果希望输出 ...