C++底子 面试 八股文(一)

金歌  论坛元老 | 2025-3-29 23:49:11 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1818|帖子 1818|积分 5454

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
C++语言特点

1.C++在C语言底子上引入了面向对象的机制,同时也兼容C语言。
2.C++有三大特性(1)封装;(2)继续;(3)多态;
3.C++编写出的步伐布局清晰、易于扩充,步伐可读性好。
4.C++生成的代码质量高,运行服从高,仅比汇编语言慢10%~20%;
5.C++更加安全,增加了const常量、引用、智能指针、四类cast转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)、try—catch等等;
6.C++可复用性高,引入了模板的概念,并且实现了方便开发的尺度模板库STL(Standard Template Library)。
C语言与C++的区别

1.C语言是C++的子集,C++可以很好地兼容C语言。同时C++又有很多新特性,如引用、智能指针、auto变量等。
2.C++是面向对象的编程语言;C语言是面向过程的编程语言。
3.C语言有一些不安全的语言特性,如指针使用的潜伏危险、逼迫转换的不确定性、内存泄漏等。而C++对此增加了不少新特性来改善安全性,如const常量、引用、cast转换、智能指针、try—catch等等;
4.C++可复用性高,引入了模板的概念,并且实现了方便开发的尺度模板库STL。C++的STL库相对于C语言的函数库更灵活、更通用。
C++中struct和class的区别

1.struct 一样平常用于描述一个数据布局聚集,而 class 是对一个对象数据的封装;
2.struct 中默认的访问控制权限是 public 的,而 class 中默认的访问控制权限是 private 的
3.在继续关系中,struct 默认是公有继续,而 class 是私有继续;
4.class 关键字可以用于定义模板参数,就像 typename,而 struct 不能用于定义模板参数
include头文件的顺序以及双引号""和尖括号<>的区别

1.尖括号<>的头文件是系统文件,双引号"“的头文件是自定义文件。
2.编译器预处理阶段查找头文件的路径不一样。
使用尖括号<>的头文件的查找路径:编译器设置的头文件路径–>系统变量。
使用双引号”"的头文件的查找路径:当前头文件目次–>编译器设置的头文件路径–>系统变量。
C++布局体和C布局体的区别

1.C的布局体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。
2.C的布局体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。
3.C语言的布局体是不可以继续的,C++的布局体是可以从其他的布局体或者类继续过来的。
4.C中使用布局体必要加上 struct 关键字,或者对布局体使用 typedef 取别名,而 C++ 中可以省略 struct 关键字直接使用。
导入C函数的关键字是什么,C++编译时和C有什么不同?

关键字:在C++中,导入C函数的关键字是extern,在函数代码前面加上extern "C"后,编译器会将这部分代码按C语言进行编译。
编译区别:由于C++支持函数重载,因此编译器编译函数的过程中会将函数的函数名、参数范例加到编译后的代码中;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数范例,一样平常只包括函数名。
简述C++从代码到可执行二进制文件的过程

一个C++步伐从源码到执行文件,有四个过程,分别为预编译、编译、汇编、链接。
预编译:处理预编译指令,过滤注释,添加行号和文件名标识
1.将全部的#define删除,并且展开全部的宏定义;2.处理全部的条件预编译指令,如#if、#ifdef;3.处理#include预编译指令,将被包含的文件插入到该预编译指令的位置;4.过滤全部的注释;5.添加行号和文件名标识。
编译:进行词法分析、语法分析和语义分析,并进行代码优化,生成汇编代码
1.词法分析:将源代码的字符序列分割成一系列的记号;2.语法分析:对记号进行语法分析,产生语法树;3.语义分析:判断表达式是否有意义;4.代码优化;5.目标代码生成:生成汇编代码;6.目标代码优化。
汇编:主要是将汇编代码变化成机器可以执行的指令。
链接:将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的步伐。
静态链接,在链接的时间就已经把要调用的函数或者过程链接到了生成的可执行文件中。就算你再去把静态库删除也不会影响可执行步伐的执行;生成的静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。
动态链接,在链接的时间没有把调用的函数代码链接进去,而是在执行的过程中,再去找要链接的函数,生成的可执行文件中没有函数代码,只包含函数的重定位信息。所以当你删除动态库时,可执行步伐就不能运行。生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。
static关键字的作用

在编译期间分配内存空间,在步伐的整个生命周期内一直保存
1.定义静态变量。初始化的静态变量会在数据段分配内存,未初始化的静态变量会在BSS段分配内存。静态变量只能在本源文件中使用。
2.定义静态函数。静态函数只能在本源文件中使用。
3.定义类中的静态成员变量和静态成员函数。
变量

全局变量、静态变量都在静态存储区,只会初始化一次
1.动态变量
1.1 全局变量
在全部函数的外部定义(包括主函数),定义之后的全部函数都能使用,属于静态存储
作用域为当前文件,外部文件可以通过extern关键字来声明另一个文件中存在的全局变量
1.2 局部变量
在函数内部定义,属于动态存储,其他函数不能访问,外部文件也不能访问
作用域为当前函数,生命周期为从函数调用到函数退出
2.静态变量
2.1 静态全局变量
作用域为当前文件,生命周期为从步伐运行到步伐退出,即贯穿整个运行时间,不可以通过extern在外部文件中使用
2.2 静态局部变量
作用域为当前函数,生命周期为从步伐运行到步伐退出,即贯穿整个运行时间,当下次函数调用时,静态局部变量不会被再次初始化,而是相沿前次函数退出时的值
1.作用域:C++里作用域可分为6种:全局,局部,类,语句,命名空间,文件作用域。
全局变量:全局作用域,可以通过extern作用于其他非定义的源文件。
静态全局变量 :全局作用域+文件作用域,所以无法在其他文件中使用。
局部变量:局部作用域,比如函数的参数,函数内的局部变量等等。
静态局部变量 :局部作用域,只被初始化一次,直到步伐竣事。
类静态成员变量:类作用域。
2.所在空间:局部变量在栈上,全局变量、静态变量都在静态存储区。
3.生命周期:局部变量在栈上,出了作用域就回收内存;而全局变量、静态变量都在静态存储区,直到步伐竣事才会回收内存。类静态成员变量在静态存储区,当超出类作用域时回收内存。
静态变量什么时间初始化

对于C语言的全局变量和静态变量,初始化发生在代码执行之前,属于编译期初始化。
而C++尺度规定:全局或静态对象当且仅当对象初次用到时才进行构造。
数组和指针的区别

数组:在内存中连续存放,每个元素占用内存相同,可以通过下标敏捷访问数组中任何元素。 数组名是首元素的地址。
指针:指针相称于一个变量,存放的是其它变量在内存中的地址。 指针名指向了内存的首地址。
赋值:同范例指针变量可以相互赋值;数组只能一个一个元素的赋值或拷贝
存储方式:数组在内存中是连续存放的,开发一块连续的内存空间。数组的存储空间,不是在静态区就是在栈上。指针可以指向任意范例的数据。指针的范例分析了它所指向地址空间的内存。由于指针本身就是一个变量,再加上它所存放的也是变量,所以指针的存储空间不能确定。
函数指针

指向函数的指针变量。每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。
函数指针与指针函数的区别

指针函数本质是一个函数,其返回值为指针。
函数指针本质是一个指针,其指向一个函数。
野指针

指针指向的位置是不可知的,指向一个不确定的地址空间
原因:1.指针变量未初始化;2.指针释放后未置空;3.指针操作超出变量作用域
释放内存后指针不实时置空(野指针),依然指向了该内存,那么大概出现非法访问的错误。
避免方法:1.初始化置为空指针;2.申请内存后判空;3.指针释放后置为空指针;4.使用智能指针
悬空指针

指针所指向的内存被释放,但是指针仍指向该内存。
使用指针时应注意什么?

1.定义指针时,先初始化为空指针。
2.用malloc或new申请内存之后,应该立刻查抄指针值是否为空指针。防止使用指针值为空的内存。
3.不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。
4.避免数字或指针的下标越界
5.动态内存的申请与释放必须配对,防止内存泄漏
6.用free或delete释放了内存之后,立刻将指针设置为空指针,防止“野指针”
内联函数 inline

以代码膨胀为代价,省去了函数调用的开销,从而进步函数的执行服从
本质上是一个函数,内联函数一样平常用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。
内联函数在编译的时间进行代码插入,编译器会在每处调用内联函数的地方直接把内联函数的内容展开,这样可以省去函数调用的开销,进步服从。
内联函数在编译的时间会进行范例的查抄,内联函数满足函数的性子,比如有返回值、参数列表等。
宏定义

预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,进步了服从
在预编译的时间把全部的宏名用宏体来更换,简单的说就是字符串更换
没有范例查抄的,无论对照旧错都是直接更换
const和define的区别

1.const用于定义常量;而define用于定义宏,而宏也可以用于定义常量
2.const见效于编译的阶段;define见效于预处理阶段。
3.const定义的常量,在C语言中是存储在内存中、必要额外的内存空间的;define定义的常量,运行时是直接的操作数,并不会存放在内存中。
4.const定义的常量是带范例的;define定义的常量不带范例。因此define定义的常量倒霉于范例查抄。
const

const int a a是一个常量
int const *a a指针所指向的内存里的值不变,即(*a)不变
const int *a 同int const *a
int *const a a指针所指向的内存地址不变,即a不变
const int *const a 都不变,即(*a)不变,a也不变
malloc与new的区别

1.malloc与free是C++/C语言的尺度库函数,必要头文件支持;new/delete是C++的关键字,必要编译器支持。它们都可用于申请动态内存和释放内存。
2.使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据范例信息自行计算。而malloc则必要显式地指出所需内存的尺寸
3.new操作符内存分配乐成时,返回的是对象范例的指针,范例与对象相同,无须进行范例转换。而malloc内存分配乐成则是返回void * ,必要通过逼迫范例转换将void*指针转换成我们必要的范例
4.malloc/free是库函数,只能动态地申请和释放内存,无法用于执行构造函数和析构函数。必要使用new/delete来调用构造函数和析构函数
5.new从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特别内存,用于步伐的内存动态分配。
malloc与new的底层实现

malloc底层实现:当开发的空间小于 128K 时,调用 brk()函数;当开发的空间大于 128K 时,调用mmap()。malloc接纳的是内存池的管理方式,以减少内存碎片。先申请大块内存作为堆区,然后将堆区分为多个内存块。当用户申请内存时,直接从堆区分配一块符合的空闲块。接纳隐式链表将全部空闲块链接,每一个空闲块记录了一个未分配的、连续的内存地址。
new底层实现:关键字new在调用构造函数的时间实际上进行了如下的几个步调:
1.创建一个新的对象;2.将构造函数的作用域赋值给这个新的对象(因此this指向了这个新的对象);3.执行构造函数中的代码(为这个新对象添加属性);4.返回新对象
简述C++有几种传值方式,之间的区别是什么?

传参方式有这三种:值传递、引用传递、指针传递
值传递:形参即使在函数体内值发生变化,也不会影响实参的值;
引用传递:形参在函数体内值发生变化,会影响实参的值;
指针传递:在指针指向没有发生改变的前提下,形参在函数体内值发生变化,会影响实参的值;

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表