C和C++的区别

同为本地编译型语言

编译型语言: 直接编译成本地机器码 运行效率快 Go
脚本语言 脚本解释器运行在本地操作系统上 Python Java PHP

同为强类型语言

强/静态类型语言:C/C++/Java 变量定义必须指定类型,定义后类型不能改变
弱/动态类型语言:Python/PHP 给变量赋值数据的类型 变量就会变成该类型

面向过程和面向对象

C++ 是面向对象语言 C是面向过程语言

C++支持带默认值参数的函数

1.函数形参给默认值 从右向左提供
2.可以在函数定义/函数声明时提供默认值
3.调用带默认值的参数和调用普通函数的区别
带默认值更快
不用将参数传递给寄存器 和常数一样 直接入栈 效率高

C++函数支持重载

1.为什么C不支持/C++支持
C语言编译器生成函数符号 只按照函数名生成 C中多个函数,函数名相同,就会报错,因为生成的函数符号相同无法区分。
C++语言编译器生成函数符号 按照了函数名个参数列表一起生成,所以一组函数函数名相同,参数列表不同(参数的个数/类型不同),构成了重载函数

2.函数重载的调用是在什么阶段确定的?
编译阶段

3.多态
静态多态(编译时期) 函数重载/模板
动态多态 (运行时期)虚函数

4.C++/C 互相调用函数接口
编译器生成函数符号的规则不同 所以符号表找不到 不能互相调用
C++ 调用C 把C接口声明放到extern"C"{}里面
C调用C++ C++源码放在extern “C”{}里面

5.#ifdef __cplusplus作用
C写的项目 头文件声明放在宏里面 给C/C++代码直接使用

6.什么叫函数重载
先说符号生成规则 再说重载动议
符号生成 C不带参数列表 C++带参数列表
一组函数,函数名相同,参数列表不同(个数/类型不同
前提:这一组函数要构成重载 必须在一个作用域空间

malloc 和 new 的区别

申请内存的位置不同

new从自由存储区(free store)上为对象分配内存空间,malloc从堆中分配内存空间
new操作符进行内存申请,该内存就是自由存储区,可以在任意位置,这取决于new 运算符重载的实现细节,使用定位new可以不为对象分配内存,malloc只能从堆上分配空间,使用free释放资源。

运算符和库函数

new C++的运算符
malloc C的库函数

是否初始化

new 开辟内存并且初始化
malloc 开辟但不初始化

返回类型安全性

new操作成功时返回的是对象类型的指针,类型严格与对象匹配,无需进行类型转换,new是符合类型安全的操作符,
malloc内存分配成功则返回void* 需要通过强制类型转换转换void*类型指针,类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问未授权的内存部分。

内存分配失败的返回值

new内存分配失败,会抛出bac_alloc异常,不会返回NULL;
malloc内存分配失败时返回NULL。

是否需要指定内存大小

new申请内存分配无需指定内存块的大小,编译器会根据类型计算
malloc需要显示指出内存尺寸

是否调用构造/析构函数

new
1)调用operator new函数分配一块足够大,原始的,未命名的内存空间存储特定类型的对象。
2)编译器运行相应的构造函数以构造对象,为其传入初值
3)对象构造完成后,返回一个指向该对象的指针。
delete释放对象内存
1)调用对象的析构函数
2)编译器调用operator delete释放内存空间
malloc不会

对数组的处理不同

new 提供了new[]/delete[]来专门处理数组类型
new会分别调用构造函数函数初始化每一个数组元素,释放对象时为每个元素调用析构函数
malloc只会提供一个原始内存和内存地址

new和malloc是否可以互相调用

new的实现可以基于malloc
malloc的实现不能调用new

是否可以被重载

new支持重载有8个重载版本
malloc不允许重载

客户内存分配不足

new 可以指定处理函数或者重新制定分配器
malloc 无法通过用户代码进行处理

底层实现

new底层调用malloc来开辟内存
new还能继续做初始化操作

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值