虽然很多地方都说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/

Object-C 与C/C++的区别相关推荐

  1. Java中Object.equals与String.equals的区别

    基础知识 Java的存储空间:寄存器.栈.堆.静态存储区.常量存储区(常量池).其他存储位置. 此处重点介绍堆和常量存储区: 堆:存储new的对象; 常量池:用来存储final static.Stri ...

  2. JavaSE学习总结(八)常用类(上)Object类==与equals方法的区别浅克隆的特点Scanner类String类String两种创建对象方式的区别String类的各种功能

    JavaSE学习总结(八)常用类(上)/Object类/==与equals方法的区别/浅克隆的特点/Scanner类/String类/String两种创建对象方式的区别/String类的各种功能 常用 ...

  3. 【Java之多线程(二)】(***重要***)Java多线程中常见方法的区别,如object.wait()和Thread.sleep()的区别等

    1.Java中Thread和Runnable的区别??? 区别: 在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处: 避免点 ...

  4. Java:Object.hashCode()和System.identityHashCode()的区别

    今天在看HashMap源码的时候注意到了这件事:Java源码详解二:HashMap源码分析–openjdk java 11源码 对红黑树中的节点进行排序时,如果hashCode相同,类不是compar ...

  5. Thread.sleep() / Object.wait() / Condition.await() / LockSupport.park() / LockSupport.unpark() 区别

    转自:https://www.cnblogs.com/tong-yuan/p/11768904.html Thread.sleep()和Object.wait()的区别 首先,我们先来看看Thread ...

  6. object.getClass()和Object.class的区别

    https://blog.csdn.net/xiaokang123456kao/article/details/72859765 首页 博客 学院 下载 图文课 论坛 APP 问答 商城 VIP会员 ...

  7. Java Servlet 过滤器与 springmvc 拦截器的区别?

    前言:在工作中,遇到需要记录日志的情况,不知道该选择过滤器还是拦截器,故总结了一下. servlet 过滤器 定义 java过滤器能够对目标资源的请求和响应进行截取.过滤器的工作方式分为四种 应用场景 ...

  8. Java中泛型 Class<T>、T与Class<?>、 Object类和Class类、 object.getClass() 和 Object.class

    From:Java中泛型 Class<T>.T 与 Class<?>. Object类 和 Class类. object.getClass() 和 Object.class : ...

  9. 浅谈Scala 2.8的包对象(package object)

    2019独角兽企业重金招聘Python工程师标准>>> Scala 2.8提供包对象(package object)的新特性.什么是包对象呢?按我的理解,根据Scala"一 ...

  10. JAVA面试要点007---equals和==的区别小结

    JAVA技术交流QQ群:170933152 ==: == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象.比较的是真正意义上的指针操作. 1 ...

最新文章

  1. 解读dbcp自动重连那些事---转载
  2. C语言学习之1到5的乘积1到N的乘积
  3. 合集 | 我在传统行业做数字化转型
  4. 关于这道填空题,你会如何回答?(附带学习链接)
  5. 机器学习基础(五十四)—— 支持向量机(SVM)
  6. python报表自动化系列 - 通过Python使用MySQL数据库
  7. 截至2006年3月1日全球CCIE人数统计
  8. VS2010 winform程序发布步骤
  9. KITTI raw data 镜像地址
  10. 直流调速系统概述工作原理实训教学
  11. 三面网易,四面阿里,五年开发经验程序员剑指大厂,稳拿P7offer
  12. 制作Docker镜像,用来下载OpenJDK11源码
  13. 看到了便有增加福慧机会的好文
  14. 五维图matlab,五维立体图,怎么画五维图(即以五边形反映各项水平)
  15. go程序cpu过高问题排查方法
  16. 关于ReportingService配置邮件发送报表到其他邮箱的配置
  17. 推荐 :如何全面解析数据并创造数据故事
  18. web(ASP)常用代码
  19. Linux SDIO WIFI Marvell8801/Marvell88w8801(六) --- Marvell Linux Wi-Fi driver介绍-WIFI插入卡槽内发生的事情
  20. shell命令执行完的退出状态详解+if语句的定义方法

热门文章

  1. Latex数学符号输入大全
  2. 中国电信5G技术控制云
  3. 通信专业综合能力(中级)考试大纲
  4. 修改Hosts不生效的解决办法
  5. H5个人博客模板分享
  6. matlab 系统 h10,Thinkbook、ThinkPad出厂带H10混合固态的机器重装系统启用傲腾的方法...
  7. 消防工程师 10.2 火灾自动报警系统-设计要求
  8. 解决被西刺代理封ip的问题
  9. Docker下载Nginx镜像并运行Nginx容器
  10. sql获得当前时间 与 SQL 比较时间大小