c++面试知识点补充

1.说说c++结构体和c结构体的区别
(1)c的结构体内不允许有函数存在,c++允许有内部成员函数,且允许该函数是虚函数。
(2)c的结构体对内部成员变量的访问权限只能是public,而c++允许public,protected,
private三种。
(3)c的结构体是不可以继承的,c++的结构体是可以从其他的结构体或者类继承过来的。
(4)c中使用结构体需要加上struct关键字,而c++可以省略struct关键字直接使用。
2.导入c函数的关键字是什么,c++编译时和c有什么不同?
(1)关键字:在c++中,导入c函数的关键字是extern,表达形式为extern “C”,主要作用:正确
实现c++代码调用其他c语言代码。
(2)编译区别:由于c++支持函数重载,因此编译器函数的过程中会将函数的函数的参数类型
也加到编译后的代码中,而不仅是函数名;因c语言不支持函数重载,因此编译c语言代码时
不会带上函数的参数类型,只包含函数名。
代码:
//extern示例 
//在C++程序里边声明该函数,会指示编译器这部分代码按C语言的进行编译 
extern "C" int strcmp(const char *s1, const char *s2); 
 //在C++程序里边声明该函数 
 extern "C"{  
    #include <string.h>
    //string.h里边包含了要调用的C函数的声明 
    } 
     //两种不同的语言,有着不同的编译规则,比如一个函数fun,
     //可能C语言编译的时候为_fun,而C++则是__fun__
3.c++从代码到可执行文件过程:
分为四个过程:预编译,编码,汇编,链接
(1).预编译:
a.将所有的#define删除,且展开所有的宏定义;
b.处理所有的条件预编译指令,如#if.#ifdef;
c.处理#include预编译指令,将包含的文件插入到该预编译指令的位置;
d.过滤所有的注释;
e.添加行号和文件名标识;

(2)编译:生成汇编代码
(3)汇编:将汇编代码转变成机器可以执行的指令;
(4)链接:将不同源文件产生的目标文件进行链接,从而形成可执行程序。
链接分为静态链接和动态链接。
静态:在链接时把调用的函数或者过程链接到了生成的可执行文件中,就算删除静态库也不会
影响可执行程序的执行。生成的静态链接库,windows下以.lib为后缀,linux下以.a后缀。

动态:在链接时没有把调用的函数代码链接进去,而是在执行过程中,再去找链接的函数,生成的可执行文件中没有函数
代码,只包含函数的重定位信息,当删除动态库时,可执行程序就不能运行。生成的动态库链接,windows下以.dll为后缀,
linux下以.so为后缀。
4.野指针
概念:指向的指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)。
原因:释放内存后指针不及时置空,还是指向该内存,可能出现非法访问的错误。
避免:初始化置null,申请内存后判空,指针释放后置null,使用智能指针。
1.c++内存
堆和栈区别:
(1)堆栈空间分配不同。栈由操作系统自动分配释放,存放函数的参数值,局部变量等;堆由程序员分配释放。
(2)堆栈缓存方式不同。栈使用一级缓存,通常被调用时处于存储空间中,调用完毕立即释放;
堆则是存放在二级缓存中,速度要慢些。
(3)堆栈数据结构不同。堆类似于数组结构;栈类似于栈结构,先进后出。
2.c++内存管理
(1)分配方式:
分为5个区,分别:堆,栈,自由存储区,全局/静态存储区和常量存储区。
栈:执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束会自动被释放。
堆:由new分配的内存块,一般一个new对应一个delete.
自由存储区:由malloc等分配,和堆相似,不过用free来结束自己
全局/静态存储区:全局变量和静态变量被分配到同一块内存中
常量存储区:比较特殊,存放的是常量,不允许修改。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值