Object-C 与C/C++的区别_objective-c和c++的区别_jimmyleeee的博客-程序员秘密

技术标签: C++  Object C  

虽然很多地方都说Object C 是是C的超集,"Objective-C is a general-purpose, object-oriented programming language that adds Smalltalk-style messaging to the C programming language. " 但是,在基本的语法和一些实现上还是有一定的区别的,本文是从工作中遇到的不同的部分整理如下:

1)Object C 的类只能继承一个类,不能继承多个类,如果要实现类似多个继承,需要使用Category和Extension, Extension是没有名字的Category,也就是匿名Category。

2)Object C从2011年引入了 Automatic Reference Counting (ARC),支持垃圾收集,不需要担心内存泄露的问题;而C++依然不支持,需要自己手工管理内存。

3) Object 不支持运算符重载,而C++支持;

4) 保留的关键字不一样;Object C: weak NSObject NSInteger NSNumber等;

5)Object C有block的概念,如下代码:

double (^multiplyTwoValues)(double, double) = 
   ^(double firstValue, double secondValue) {
      return firstValue * secondValue;
   };

double result = multiplyTwoValues(2,4); 
NSLog(@"The result is %f", result);

感觉和C的函数指针差不多。

6)Object C 和 C/C++都有 指针的概念,但是,指针的使用却不同。

例如: 

Object C:

Box *box1 = [[Box alloc]init];

box1.height = 5;

C、C++:

Box *box1 = new Box();

box1->height = 5;

7) Object 有 Protocol,C/C++没有。Protocol的定义是: Objective-C allows you to define protocols, which declare the methods expected to be used for a particular situation. Protocols are implemented in the classes conforming to the protocol

8)Object C的for语句,支持Fast enumeration Syntax,而C语言不支持

for (classType variable in collectionObject ) { 
  statements 
}

9) Object 不支持命名空间,而C/C++支持命名空间。

10)Object C 的类需要声明init函数初始化对象和dealloc释放对象,没有构造函数和析构函数;而C++通过构造函数初始化对象,析构函数释放;

11) Object C虽然也支持泛型,但是一般不建议使用,会影响效率;而C++的STL、Boost则大量使用了泛型;

12) Object C初始化指针为空使用nil;C、C++使用NULL;

13) Object C没有虚拟继承;而C++有虚拟继承;

14) Object C由于不支持命名空间,所以,编译之后没有将类名mangle,经过查看bitcode,发现其实函数名也没有mangle;C、C++编译之后会把类和函数名字mangle;关于Name Mangling可以参考:https://en.wikipedia.org/wiki/Name_mangling#Demangle_via_c++filt

实际操作环境:XCode 11.4.1 & apple clange 11.0.3

15) Object C 类的成员函数调用使用的是消息机制,即使用指令objc_msgSend发送一个消息给指定的类和函数;而C、C++是直接调用mangle之后的函数名。关于demangle可以参考:https://github.com/gimli-rs/cpp_demangle

16) Object C 类本身使用self,C++使用this;

17)  Object C 对于类型不确定的对象可以使用id表示,C、C++使用Void *;

18) Object C 使用YES/NO表示TRUE/FALSE,

19) Object C 使用#import引入其他文件,#import 确定一个文 件只能被导入一次;C、C++使用#include,并且无法去报一个文件不会被导入一次,因此需要在头文件中使用宏控制;

20) Object C支持反射机制,C、C++不支持

21) Object C中只有数据成员的访问限制,没有方法的访问限制;C、C++数据成员和方法都有访问控制(public、protected和private)。

22) Object C没有静态变量,有全局变量;C、C++两者都支持

23)  Object C中的数组NSArray 可以保存不同类型的变量,而C++不可以;

24) Object C所有的类都必须继承于 NSObject;而C++对自定义的类的基类没有要求;

25) Objective C 提供了运行期动态绑定机制, 而 C++ 是编译时静态绑定;

 

后面遇到会持续更新......

       

参考:

https://www.tutorialspoint.com/objective_c/objective_c_quick_guide.htm

http://cocoadevcentral.com/d/learn_objectivec/

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jimmyleeee/article/details/105511062

智能推荐

电脑开机出现error: no such partition...的解决办法_error-no connection_暴躁竹子的博客-程序员秘密

之前电脑装了windows10+deepin15.3(linux)双系统,由于某些原因我在window系统中把linux所在的分区删了,导致系统无法开机,提示error:no such partition……具体如图所示,用手机上网搜索了一下,发现需要用PE才行,可是我手上有没有PE系统,怎么办?突然想起自己在装win10的系统盘还在,于是我就这么愉快的又在网上找到了其他的解决办法了,废话不多少在

工业建模和游戏建模有什么区别?哪个发展前景更好?_旺仔带你学建模的博客-程序员秘密

首先3D建模一般分为工业建模和游戏建模两种,工业建模分为室内设计和室外设计,以及机械建模。在制作模型时,会相比于游戏建模更注重尺寸的标注和制作标准。而后者则不同,游戏建模主要是负责游戏里模型的制作,游戏建模对技能要求也更高,游戏里需要考虑到优化的问题,不能用高模,需要把模型优化成低模另外,工业建模都是通过材质球来表现材质,很多材质球都是自带,但是游戏建模是自己绘制贴图,划分uv,相对于工业建模技术要求更高。其实这两者我还是有偏向性的,个人觉得游戏建模的发展前景是非常好的。虽然说工业建模起步高

linux ext4 格式化工具,ext4格式化软件 mkfs.ext4 快速格式化_花总丢了金箍棒的博客-程序员秘密

如何在 Windows 下访问 ext4 格式的硬盘你好,介绍两个能在 Windows 下读取ext4分区的软件。第一个是 Ext2Read。它能查看 ext2/3/4 分区并从中拷贝文件和目录,支持 LVM2 和 EXT4 extent ,以及递归拷贝整个目录。第二个是本站之前介绍过的 Ext2Fsd ,它是适用于Windows 2000, XP, Vista, 7的驱动程序,能使这些系统直接支...

拷贝初始化与直接初始化的区别_拷贝初始化和直接初始化_linda_ds的博客-程序员秘密

copy-initialization vs direct-initializationLINDA2018/8/31copy-initialization指用一个对象初始化另外一个对象:在下面这6种情况下发生:T object = other; //(1) 当一个非引用类型T的具名变量通过 '=' 被一个表达式初始化时 T object = {other}; //(...

有限差分法及matlab实现,有限差分法与matlab实现_南小鹏的博客-程序员秘密

《有限差分法与matlab实现》由会员分享,可在线阅读,更多相关《有限差分法与matlab实现(13页珍藏版)》请在金锄头文库上搜索。1、 有限差分法解静电场的边值问题的算法实现及相关问题讨论: 王宁远 中国科学技术大学 09 级物理 2班 E-mail wnymail.ustc.edu.cn 摘要: 本文用MATLAB实现了有限差分法解静电场边值问题的算法,将偏微分方程的问题化为线性方程 组问题...

【零基础入门学习Python笔记013】元祖:戴上了枷锁的列表_weixin_33949359的博客-程序员秘密

元组:戴上了枷锁的列表因为和列表是近亲关系。所以元祖和列表在实际使用上是很相似的。本节主要通过讨论元素和列表究竟有什么不同学习元祖。元组是不可改变元素的。插入、删除或者排序都不能够。列表能够随意改变一个元素。插入或者删除一个元素等。主要从下面几个点来讨论学习:创建和訪问一个元组创建一个列表主要是一个方括号“[ ]”,而创建一个元组不是一个圆括号,而是逗号;创建一个空...

随便推点

vue手写签名,canvas手写签名,canvas签名图片旋转_vue-esign横屏_。李的博客-程序员秘密

安装: npm install vue-esign --save在main.js 中引入import vueEsign from 'vue-esign'Vue.use(vueEsign)1.手写签名在“手机竖屏”的情况下会展示横屏的画板样式,2.如果手机横屏的话,系统会进行适配,所以这时候展示竖屏的样式(手机翻转的时候重新生成canvas)3.因为"手机竖屏“展示横屏的样式,所以提交的时候要把签名的图片旋转一下4.设备的x,y轴坐标与画布的坐标不准确,还有页面布...

java中Map循环的几种方式_一笑而过者也的博客-程序员秘密

package com.xhx.collection;import org.junit.Test;import java.util.HashMap;import java.util.Iterator;import java.util.Map;/** * xuhaixing * 2018/7/15 19:59 **/public class TestHashMapApp {...

《深入理解ES6》第十一章 Promise 与 异步编程_吴钦飞的博客-程序员秘密

第十一章 Promise 与 异步编程《深入理解ES6》—— Nicholas C. ZakasJS能极其轻易地处理异步编程,如响应 点击或按键 之类的用户交互行为。node.js 通过使用回调函数来代替事件,进一步推动了JS中的异步编程。随着异步编程面对的场景日益复杂,事件与回调 已不足以支持所有需求,Promise应运而生。Promise 是异步编程的一种选择,延迟并在将来执行作业。1. 异步编程的背景1.1. 说明JS引擎建立在单线程事件循环的概念上。单线程:单线程(sing

ubuntu 12.04 64位系统 找不到arm-linux-gcc文件_小舞hailey的博客-程序员秘密

未安装32位兼容包,编译出现未找到指定目录下gcc命令,则安装兼容包:sudo apt-get install ia32-libs

centos7设置系统环境变量_weixin_33946020的博客-程序员秘密

2019独角兽企业重金招聘Python工程师标准>>> ...

推荐文章

热门文章

相关标签