没有合适的资源?快使用搜索试试~ 我知道了~
C++面试题集锦.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 158 浏览量
2024-03-26
23:37:42
上传
评论
收藏 2MB PDF 举报
温馨提示
试读
140页
C++面试题集锦,总共140页,包含C++语法,Linux,操作系统,网络,算法,数据结构,数据库,设计模式,HR问题等面试常见问题。非常好用,一般面试问的问题都有总结到。 仅供参考复习使用,切勿为了自己过面试死记硬背,自己有实力最重要。
资源推荐
资源详情
资源评论
C++
1. 引用和指针的区别?
1) 指针是一个实体,需要分配内存空间。引用只是变量的别名,不需要分配内存空间。
2) 引用在定义的时候必须进行初始化,并且不能够改变。指针在定义的时候不一定要
初始化,并且指向的空间可变。(注:不能有引用的值不能为 NULL)
3) 有多级指针,但是没有多级引用,只能有一级引用。
4) 指针和引用的自增运算结果不一样。(指针是指向下一个空间,引用时引用的变量
值加 1)
5) sizeof 引用得到的是所指向的变量(对象)的大小,而 sizeof 指针得到的是指针本
身的大小。
6) 引用访问一个变量是直接访问,而指针访问一个变量是间接访问。
7) 使用指针前最好做类型检查,防止野指针的出现;
8) 引用底层是通过指针实现的;
9) 作为参数时也不同,传指针的实质是传值,传递的值是指针的地址;传
引用的实质是传地址,传递的是变量的地址。
2. 从汇编层去解释一下引用
1. 9: int x = 1;
2. 00401048 mov dword ptr [ebp-4],1
3. 10: int &b = x;
4. 0040104F lea eax,[ebp-4]
5. 00401052 mov dword ptr [ebp-8],eax
x 的地址为 ebp-4,b 的地址为 ebp-8,因为栈内的变量内存是从高往低进行分配
的。所以 b 的地址比 x 的低。lea eax,[ebp-4] 这条语句将 x 的地址 ebp-4 放入 ea
x 寄存器 mov dword ptr [ebp-8],eax 这条语句将 eax 的值放入 b 的地址 ebp-8 中
上面两条汇编的作用即:将 x 的地址存入变量 b 中,这不和将某个变量的地址存
入指针变量是一样的吗?所以从汇编层次来看,的确引用是通过指针来实现的。
3. C++中的指针参数传递和引用参数传递
1) 指针参数传递本质上是值传递,它所传递的是一个地址值。值传递过程中,被调函数的
形式参数作为被调函数的局部变量处理,会在栈中开辟内存空间以存放由主调函数传递
进来的实参值,从而形成了实参的一个副本(替身)。值传递的特点是,被调函数对形
式参数的任何操作都是作为局部变量进行的,不会影响主调函数的实参变量的值(形参
指针变了,实参指针不会变)。
2) 引用参数传递过程中,被调函数的形式参数也作为局部变量在栈中开辟了内存空间,但
是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参(本体)的任何
操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量(根据别
名找到主调函数中的本体)。因此,被调函数对形参的任何操作都会影响主调函数中的
实参变量。
3) 引用传递和指针传递是不同的,虽然他们都是在被调函数栈空间上的一个局部变量,但
是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变
量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将应用不到主调函数
的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量(地址),那就得
使用指向指针的指针或者指针引用。
4) 从编译的角度来讲,程序在编译时分别将指针和引用添加到符号表上,符号表中记录的
是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,
而引用在符号表上对应的地址值为引用对象的地址值(与实参名字不同,地址相同)。
符号表生成之后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),
而引用对象则不能修改。
4. 形参与实参的区别?
1) 形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存
单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使
用该形参变量。
2) 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数
调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋
值,输入等办法使实参获得确定值,会产生一个临时变量。
3) 实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错
误。
4) 函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形
参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中
的值不会变化。
5) 当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们
在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候
形参被释放,而实参内容不会改变。
1) 值传递:有一个形参向函数所属的栈拷贝数据的过程,如果值传递的对象是类对象
或是大的结构体对象,将耗费一定的时间和空间。(传值)
2) 指针传递:同样有一个形参向函数所属的栈拷贝数据的过程,但拷贝的数据是一个
固定为 4 字节的地址。(传值,传递的是地址值)
3) 引用传递:同样有上述的数据拷贝过程,但其是针对地址的,相当于为该数据所在
的地址起了一个别名。(传地址)
4) 效率上讲,指针传递和引用传递比值传递效率高。一般主张使用引用传递,代码逻
辑上更加紧凑、清晰。
5. static 的用法和作用?
1.先来介绍它的第一条也是最重要的一条:隐藏。(static 函数,static 变量均可)
当同时编译多个文件时,所有未加 static 前缀的全局变量和函数都具有全局可见性。
2.static 的第二个作用是保持变量内容的持久。(static 变量中的记忆功能和全局生存期)
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
共有两种变量存储在静态存储区:全局变量和 static 变量,只不过和全局变量比起来,
static 可以控制变量的可见范围,说到底 static 还是用来隐藏的。
3.static 的第三个作用是默认初始化为 0(static 变量)
其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内
存中所有的字节默认值都是 0x00,某些时候这一特点可以减少程序员的工作量。
4.static 的第四个作用:C++中的类成员声明 static
1) 函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被
分配一次,因此其值在下次调用时仍维持上次的值;
2) 在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数
访问;
3) 在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被
限制在声明它的模块内;
4) 在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
5) 在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能
访问类的 static 成员变量。
类内:
6) static 类对象必须要在类外进行初始化,static 修饰的变量先于对象存在,所以 static
修饰的变量要在类外初始化;
7) 由于 static 修饰的类成员属于类,不属于对象,因此 static 类成员函数是没有 this
指针的,this 指针是指向本对象的指针。正因为没有 this 指针,所以 static 类成员函
数不能访问非 static 的类成员,只能访问 static 修饰的类成员;
8) static 成员函数不能被 virtual 修饰,static 成员不属于任何对象或实例,所以加上 vi
rtual 没有任何实际意义;静态成员函数没有 this 指针,虚函数的实现是为每一个对
象分配一个 vptr 指针,而 vptr 是通过 this 指针调用的,所以不能为 virtual;虚函数
的调用关系,this->vptr->ctable->virtual function
6. 静态变量什么时候初始化
1) 初始化只有一次,但是可以多次赋值,在主程序之前,编译器已经为其分配好了内
存。
2) 静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译
器已经为其分配好了内存,但在 C 和 C++中静态局部变量的初始化节点又有点不太
一样。在 C 中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行
初始化,所以我们看到在 C 语言中无法使用变量对静态局部变量进行初始化,在程
序运行结束,变量所处的全局内存会被全部回收。
3) 而在 C++中,初始化时在执行相关代码时才会进行初始化,主要是由于 C++引入对
象后,要进行初始化必须执行相应构造函数和析构函数,在构造函数或析构函数中
经常会需要进行某些程序中需要进行的特定操作,并非简单地分配内存。所以 C++
标准定为全局或静态对象是有首次用到时才会进行构造,并通过 atexit()来管理。在
程序结束,按照构造顺序反方向进行逐个析构。所以在 C++中是可以使用变量对静
态局部变量进行初始化的。
7. const?
1) 阻止一个变量被改变,可以使用 const 关键字。在定义该 const 变量时,通常需要对
它进行初始化,因为以后就没有机会再去改变它了;
2) 对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或
二者同时指定为 const;
3) 在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不
能改变其值;
4) 对于类的成员函数,若指定其为 const 类型,则表明其是一个常函数,不能修改类
的成员变量,类的常对象只能访问类的常成员函数;
5) 对于类的成员函数,有时候必须指定其返回值为 const 类型,以使得其返回值不为“左
值”。
6) const 成员函数可以访问非 const 对象的非 const 数据成员、const 数据成员,也可以
访问 const 对象内的所有数据成员;
7) 非 const 成员函数可以访问非 const 对象的非 const 数据成员、const 数据成员,但不
可以访问 const 对象的任意数据成员;
8) 一个没有明确声明为 const 的成员函数被看作是将要修改对象中数据成员的函数,
而且编译器不允许它为一个 const 对象所调用。因此 const 对象只能调用 const 成员
函数。
9) const 类型变量可以通过类型转换符 const_cast 将 const 类型转换为非 const 类型;
10) const 类型变量必须定义的时候进行初始化,因此也导致如果类的成员变量有 const
类型的变量,那么该变量必须在类的初始化列表中进行初始化;
11) 对于函数值传递的情况,因为参数传递是通过复制实参创建一个临时变量传递进函
数的,函数内只能改变临时变量,但无法改变实参。则这个时候无论加不加 const
对实参不会产生任何影响。但是在引用或指针传递函数调用中,因为传进去的是一
个引用或指针,这样函数内部可以改变引用或指针所指向的变量,这时 const 才是
实实在在地保护了实参所指向的变量。因为在编译阶段编译器对调用函数的选择是
根据实参进行的,所以,只有引用传递和指针传递可以用是否加 const 来重载。一
个拥有顶层 const 的形参无法和另一个没有顶层 const 的形参区分开来。
剩余139页未读,继续阅读
资源评论
等天晴i
- 粉丝: 3478
- 资源: 10万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Qt开发知识、经验总结 包括Qss,数据库,Excel,Model/View等
- IV数据.xlsx
- 一些深度学习中的小例子,适合新手学习使用
- foldcraftlauncher_262944.apk
- 珍藏多年的基于matlab实现潮流计算程序源代码集合,包含多个潮流计算程序.rar
- 使用FPGA实现串-并型乘法器
- 基于matlab实现针对基于双曲线定位的DV-Hop算法中误差误差出一种基于加权双曲线定位的DV-Hop改进算法.rar
- 基于matlab实现由遗传算法开发的整数规划,车辆调度问题.rar
- 电视家7.0(对电视配置要求高).apk
- 免费计算机毕业设计-基于JavaEE的医院病历管理系统设计与实现(包含论文+源码)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功