第二部分 C/C++区别
1.new和malloc的区别
①new是关键字,malloc是个返回值为void*的函数
②new开辟空间的大小由系统确定,malloc需要传递开辟空间的大小
③new不仅可以开辟内存,还可以做内存的初始化 ,而malloc只能进行内存开辟
如:int p1=new int(20);
④malloc开辟内存失败,是通过返回值和NULL作比较的,而new开辟内存失败,是通过抛出bad_alloc类型的异常来判断的。
⑤new开辟内存的时候是指定类型的,是返回值类型安全的,malloc的返回值类型不安全,void本来就是一个半开半闭的区间,而且malloc按照字节开辟结束后必须进行类型强转。
⑥new开辟的内存是在自由存储区域,而malloc开辟的内存在堆区
⑦new可以重载,因为new的过程是operator new()和调用构造函数,malloc没有这个概念
另外我们需要区别Delete和delete[],
例1:对一个内置类型的开辟和释放:
int p = new int[10];
//delete p;
delete []p;
对于内置类型内存的释放只需要释放内存块即可,所以delete和delete[]都可以进行释放;
例2:对于类对象的开辟和释放
Test ptest = new Test[10];//Test是一个类
//delete p;//错误
delete[] ptest;//40 44
在进行内存开辟时,实际上开辟了44个字节,其中多出来的四个字节用来存储调用构造函数的个数。对于对象的释放,采用delete时,它只能进行一次析构;原因是在开辟内存时调用了构造函数,构造函数所做的事情一是开辟内存二是获取资源。在最后释放的时候也应该要调用析构函数,一是释放内存,二是释放资源。采用delete释放时,系统不会知道需要调用多少次析构,所以没办法将所有的开辟的内存都释放;因此采用delete[],释放10次,它会从多出来的4字节中提取到调用构造的次数,然后进行一次释放。
2.函数重载(重定义),C++的符号生成规则
函数重载就是同名函数可以共存,其实函数重载属于静多态的一种,由C++得函数符号生成规则来提供支持
C++函数符号生成规则:函数返回值 函数名称(形参列表)->叫做函数原型。
我们说函数符号生成规则给函数重载提供支持,但是不能说只要函数符号不同都能构成重载,是有要求的:同名 不同参(个数 类型 顺序) 用一作用域,返回值不同不能构成重载。
3.指针和引用的区别:
从逻辑上来讲,指针就是存放变量的地址,引用就是变量的一个别名;从底层来讲,引用时实现还是通过指针,只不过是一种自身为常性的指针。何为常性
引用的几个特点:
①引用必须初始化
②不能引用不能取地址的数据
③引用不能改变
④引用变量只能操作其所引用的内存单元
4.lnline函数的特点,与宏、普通函数、static修饰的函数的区别:
Inline是在函数调用点把函数直接展开
区别:
与普通函数:没有普通函数的开栈、清栈开销
与宏:宏是在预编译阶段,inline是在编译阶段,宏没有类型和安全检查,inline有类型和安全检查,可以说inline是一种更安全的宏
与static修饰的函数:被static修饰的函数还是需要开栈清栈开销的,而inline不需要,还有他们虽然都是仅本文件可见,但是原理不同,static是修改了函数属性有g->local,inline是因为编译阶段在调用点展开代码。
inline内联的注意事项
①内联写在头文件(.h)中;
②内联只在release版本生效;
③内联只是给编译器的一个建议;不能在递归,循环以及switch中使用内联;
④内联是基于实现的关键字,应该加在定义(实现)点,而不加在声明点;
inline的优缺点:
优点:在某种程度上提高代码效率;
缺点:以代码膨胀为代价,浪费空间;
使用内联的建议:
开栈和清栈的开销大于执行的开销时,建议可以使用内联函数;
开栈和清栈的开销小于执行的开销时,不建议使用内联;
5.C和C++相互调用
1)C++调用C,在源文件.cpp中添加extern “C”
2)C调用C++
C++可以修改的时候,在源文件中加extern “C”
C++不可修改的时候,加中间层.cpp
3)不明确编译,也就是C调用C++/C文件时:
利用#ifdef __cplusplus进行处理
第二部分相关面试题目总结:
1.讲下函数重载,C/C++函数生成符号的规则
2.内联函数的使用场景
3.static 关键字 C++方面的用法
4.指针、引用区别
5.C++中的 const 是为了干什么
6.const 关键字,const 和 define 的异同
7.指针常量和常量指针区别,如何定义写一下
8.new 和 malloc 区别
9.new 失败会怎样,不想抛出异常该怎么办
10.delete 释放单个对象和数组的区别
11.变量的作用域及生存周期
12.C++中的 const,const 与 static 的区别
13.宏和内联函数的区别
14.c和 c++的区别?c 和 c++的内存分布有什么区别?
15. C++如何调用 C 语言语句
16. struct 和 class 的区别