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. qsort中的函数指针,及函数解释

    函数指针有何用 函数指针的应用场景比较多,以库函数qsort排序函数为例,它的原型如下: void qsort(void *base,size_t nmemb,size_t size , int(*c ...

  2. Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A,B,C【真的菜·】

    8说了 #include<bits/stdc++.h> using namespace std; #define int long long signed main(){ string s ...

  3. How To Use The Repository Pattern In Laravel

    The Repository Pattern in Laravel is a very useful pattern with a couple of great uses. The first us ...

  4. RabbitMQ消息队列+安装+工具介绍

    1.MQ为Message Queue,消息队列是应用程序和应用程序之间的通信方法 2. 多种开发语言支持,其实就是一个驱动,如连接数据库的mysql驱动,oracle驱动等. 3. 4.采用以下语言开 ...

  5. BCB6常用快捷键

    :: 项目管理类 ::    F10                     代码窗口全屏显示时切换到BCB的主窗口    Ctrl + F12              打开源文件清单对话框    ...

  6. /etc/inittab

    # inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON ...

  7. codeforces396A

    sol:很显然就是找出所有质因数,然后分别塞进去就行了,怎么塞就是组合数.感觉就是道小学奥数题 #include <bits/stdc++.h> using namespace std; ...

  8. 【模板】杜教筛(Sum)

    传送门 Description 给定一个正整数\(N(N\le2^{31}-1)\) 求 \[ans1=\sum_{i=1}^n \varphi(i)\] \[ans_2=\sum_{i=1}^n \ ...

  9. (转)awk 详解

    出处:https://blog.51cto.com/yijiu/1358416 awk详解 awk是一款非常牛逼的报告生成工具,能够将文本格式化成显示为比较直观的结果 废话不多说,直接上例子 awk的 ...

  10. 使用spring profile实现多环境切换

    第一步: applicationContext.xml <!--环境配置开始--> <beans profile="production"> <con ...