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还能继续做初始化操作