当前位置: 首页 > article >正文

Object-C 与C/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可以参考:GitHub - gimli-rs/cpp_demangle: A crate for demangling C++ symbols。

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++ 是编译时静态绑定;

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

       

参考:

Objective-C Quick Guide

Cocoa Dev Central: Learn Objective-C

http://www.lryc.cn/news/2418971.html

相关文章:

  • 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你
  • 网工请自查!这十个技术问题还不会就out了
  • 使用Python Web(Django)和Bootstrap制作一款精美的“在线计算器”手把手教学——(基于Windows平台开发和部署,附完整代码和演示实例)
  • StretchDIBits函数
  • 人工智能--产生式表示法
  • VC-终止线程,ExitThread函数,TerminateThread函数,撤消线程,详解
  • eclipse-che01 安装eclipseche
  • 计算机网络自学指南,怒推荐一波,简直太全面了!
  • 小米更新显示非官方rom_魔趣ROM 安装刷入教程(小白新手)
  • 多路径软件常用操作(MPIO)
  • C语言学生成绩信息管理系统(超详细版)
  • OpenProcessToken
  • 前端框架Layui学习五:弹出层和数据表格
  • 原神童梦的切片解密攻略
  • VMware虚拟机安装Linux教程(超详细) | 阿里龙蜥OS (CentOS替代品)
  • 实战中绕过disable_functions执行命令
  • 有关软件开发中的项目管理:关键性问题解答(一)
  • CSDN 居然偷偷干了这件事,VIP会员真香,速度还不错
  • PHP基础编程
  • 猪猪猫Windows7 X86旗舰中文装机版V0911
  • JVM学习记录
  • 三款图形化的SQL查询分析器工具推荐
  • 深入理解LTE-A 学习笔记(1)
  • 安卓dialer Phone进程【Telephony框架、TeleService】启动过程
  • [Python]网络爬虫(三):使用cookiejar管理cookie 以及 模拟登录知乎
  • 《SEO实战密码》笔记①-了解搜索引擎
  • document.all的用法
  • Kotlin入门(4)声明与操作数组
  • JS基本特效 -- 常见40个常用的js页面效果图(转载)
  • maven从下载到安装--详细版