没有合适的资源?快使用搜索试试~ 我知道了~
首页C++面试突击指南:全面解析与智能指针详解
C++面试突击指南:全面解析与智能指针详解
需积分: 5 1 下载量 200 浏览量
更新于2024-06-16
收藏 24.15MB PDF 举报
"这份名为《C++知识点资料1.pdf》的电子书是针对C++编程语言的新手和面试者编写的,特别注重实用性与易理解性。作者小贺以其程序员的身份背景,深入浅出地整理了高频面试中的C++知识点,共计20万多字和100多张精心绘制的图表,旨在帮助那些有一定C++基础但需巩固或串联知识点的人,特别是面试前的突击学习者。 书中内容涵盖了C++语言的基础部分,如智能指针的讲解。智能指针,如auto_ptr,是一种特殊类型的指针,设计目的是解决内存管理问题,避免程序员在函数结束时忘记释放内存导致的内存泄漏。智能指针作为类,当其作用域结束时,会自动调用析构函数释放所持有的资源。作者通过get()方法获取原始指针,提供operator()和operator->()重载操作,以及realese()方法,使得智能指针的操作更为直观和安全。 阅读这本书并不像传统的教科书那样全面,而是作为面试准备的实用工具,帮助读者在短时间内提升对C++知识的理解和掌握。书中的内容可以根据个人需求选择性阅读,每个章节都围绕实际工作和面试场景展开,适合在面试冲刺阶段快速查阅和复习。 值得注意的是,由于整理时间紧迫,可能存在一些错别字和遗漏,作者鼓励读者在学习过程中发现错误及时反馈,以便后续更新和优化。整本书通过思维导图的形式展示了目录结构,便于读者快速定位和查找所需内容。 《C++知识点资料1.pdf》是一本结合理论和实践,注重效率和针对性的C++学习资料,对于程序员面试准备和技能提升具有很高的价值。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/88857627/bg10.jpg)
理解这些声明的技巧在于,查看关键字const右边来确定什么被声明为常量 ,如果该关键字的
右边是类型,则值是常量;如果关键字的右边是指针变量,则指针本身是常量。
14、简单说⼀下函数指针
从定义和⽤途两⽅⾯来说⼀下⾃⼰的理解:
⾸先是定义:函数指针是指向函数的指针变量。函数指针本身⾸先是⼀个指针变量,该指针变
量指向⼀个具体的函数。这正如⽤指针变量可指向整型变量、字符型、数组⼀样,这⾥是指向
函数。
在编译时,每⼀个函数都有⼀个⼊⼝地址,该⼊⼝地址就是函数指针所指向的地址。有了指向
函数的指针变量后,可⽤该指针变量调⽤函数,就如同⽤指针变量可引⽤其他类型变量⼀样,
在这些概念上是⼤体⼀致的。
其次是⽤途:调⽤函数和做函数的参数,⽐如回调函数。
示例:
15、堆和栈区别
栈
由编译器进⾏管理,在需要时由编译器⾃动分配空间,在不需要时候⾃动回收空间,⼀般保存
的是局部变量和函数参数等。
连续的内存空间,在函数调⽤的时候,⾸先⼊栈的主函数的下⼀条可执⾏指令的地址,然后是
函数的各个参数。
⼤多数编译器中,参数是从右向左⼊栈(原因在于采⽤这种顺序,是为了让程序员在使⽤
C/C++的“函数参数⻓度可变”这个特性时更⽅便。如果是从左向右压栈,第⼀个参数(即描述
可变参数表各变量类型的那个参数)将被放在栈底,由于可变参的函数第⼀步就需要解析可变
char * fun(char * p) {…} // 函数fun
char * (*pf)(char * p); // 函数指针pf
pf = fun; // 函数指针pf指向函数fun
pf(p); // 通过函数指针pf调⽤函数fun
![](https://csdnimg.cn/release/download_crawler_static/88857627/bg11.jpg)
参数表的各参数类型,即第⼀步就需要得到上述参数,因此,将它放在栈底是很不⽅便的。)
本次函数调⽤结束时,局部变量先出栈,然后是参数,最后是栈顶指针最开始存放的地址,程
序由该点继续运⾏,不会产⽣碎⽚。
栈是⾼地址向低地址扩展,栈低⾼地址,空间较⼩。
堆
由程序员管理,需要⼿动 new malloc delete free 进⾏分配和回收,如果不进⾏回收的话,会
造成内存泄漏的问题。
不连续的空间,实际上系统中有⼀个空闲链表,当有程序申请的时候,系统遍历空闲链表找到
第⼀个⼤于等于申请⼤⼩的空间分配给程序,⼀般在分配程序的时候,也会空间头部写⼊内存
⼤⼩,⽅便 delete 回收空间⼤⼩。当然如果有剩余的,也会将剩余的插⼊到空闲链表中,这
也是产⽣内存碎⽚的原因。
堆是低地址向⾼地址扩展,空间交⼤,较为灵活。
16、函数传递参数的⼏种⽅式
值传递:形参是实参的拷⻉,函数内部对形参的操作并不会影响到外部的实参。
指针传递:也是值传递的⼀种⽅式,形参是指向实参地址的指针,当对形参的指向操作时,就
相当于对实参本身进⾏操作。
引⽤传递:实际上就是把引⽤对象的地址放在了开辟的栈空间中,函数内部对形参的任何操作
可以直接映射到外部的实参上⾯。
17、new / delete ,malloc / free 区别
都可以⽤来在堆上分配和回收空间。new /delete 是操作符,malloc/free 是库函数。
执⾏ new 实际上执⾏两个过程:1.分配未初始化的内存空间(malloc);2.使⽤对象的构造
函数对空间进⾏初始化;返回空间的⾸地址。如果在第⼀步分配空间中出现问题,则抛出
std::bad_alloc 异常,或被某个设定的异常处理函数捕获处理;如果在第⼆步构造对象时出现
异常,则⾃动调⽤ delete 释放内存。
![](https://csdnimg.cn/release/download_crawler_static/88857627/bg12.jpg)
执⾏ delete 实际上也有两个过程:1. 使⽤析构函数对对象进⾏析构;2.回收内存空间
(free)。
以上也可以看出 new 和 malloc 的区别,new 得到的是经过初始化的空间,⽽ malloc 得到的
是未初始化的空间。所以 new 是 new ⼀个类型,⽽ malloc 则是malloc ⼀个字节⻓度的空
间。delete 和 free 同理,delete 不仅释放空间还析构对象,delete ⼀个类型,free ⼀个字节
⻓度的空间。
为什么有了 malloc/free 还需要 new/delete?因为对于⾮内部数据类型⽽⾔,光⽤ malloc
/free ⽆法满⾜动态对象的要求。对象在创建的同时需要⾃动执⾏构造函数,对象在消亡以前
要⾃动执⾏析构函数。由于 mallo/free 是库函数⽽不是运算符,不在编译器控制权限之内,
不能够把执⾏的构造函数和析构函数的任务强加于 malloc/free,所以有了 new/delete 操作
符。
18、volatile 和 extern 关键字
volatile 三个特性
易变性:在汇编层⾯反映出来,就是两条语句,下⼀条语句不会直接使⽤上⼀条语句对应的
volatile 变量的寄存器内容,⽽是重新从内存中读取。
不可优化性:volatile 告诉编译器,不要对我这个变量进⾏各种激进的优化,甚⾄将变量直接
消除,保证程序员写在代码中的指令,⼀定会被执⾏。
顺序性:能够保证 volatile 变量之间的顺序性,编译器不会进⾏乱序优化。
extern
在 C 语⾔中,修饰符 extern ⽤在变量或者函数的声明前,⽤来说明 “此变量/函数是在别处定
义的,要在此处引⽤”。
注意 extern 声明的位置对其作⽤域也有关系,如果是在 main 函数中进⾏声明的,则只能在
main 函数中调⽤,在其它函数中不能调⽤。其实要调⽤其它⽂件中的函数和变量,只需把该
⽂件⽤ #include 包含进来即可,为啥要⽤ extern?因为⽤ extern 会加速程序的编译过程,这
样能节省时间。
![](https://csdnimg.cn/release/download_crawler_static/88857627/bg13.jpg)
在 C++ 中 extern 还有另外⼀种作⽤,⽤于指示 C 或者 C++函数的调⽤规范。⽐如在 C+
+ 中调⽤ C 库函数,就需要在 C++ 程序中⽤ extern “C” 声明要引⽤的函数。这是给链接器
⽤的,告诉链接器在链接的时候⽤C 函数规范来链接。主要原因是 C++ 和 C 程序编译完成
后在⽬标代码中命名规则不同,⽤此来解决名字匹配的问题。
19、define 和 const 区别(编译阶段、安全性、内存占⽤等)
对于 define 来说,宏定义实际上是在预编译阶段进⾏处理,没有类型,也就没有类型检查,
仅仅做的是遇到宏定义进⾏字符串的展开,遇到多少次就展开多少次,⽽且这个简单的展开过
程中,很容易出现边界效应,达不到预期的效果。因为 define 宏定义仅仅是展开,因此运⾏
时系统并不为宏定义分配内存,但是从汇编 的⻆度来讲,define 却以⽴即数的⽅式保留了多
份数据的拷⻉。
对于 const 来说,const 是在编译期间进⾏处理的,const 有类型,也有类型检查,程序运⾏
时系统会为 const 常量分配内存,⽽且从汇编的⻆度讲,const 常量在出现的地⽅保留的是真
正数据的内存地址,只保留了⼀份数据的拷⻉,省去了不必要的内存空间。⽽且,有时编译器
不会为普通的 const 常量分配内存,⽽是直接将 const 常量添加到符号表中,省去了读取和
写⼊内存的操作,效率更⾼。
20、计算下⾯⼏个类的⼤⼩
21、⾯向对象的三⼤特性,并举例说明
C++ ⾯向对象的三⼤特征是:封装、继承、多态。
所谓封装
class A{}; sizeof(A) = 1; //空类在实例化时得到⼀个独⼀⽆⼆的地址,所以为 1.
class A{virtual Fun(){} }; sizeof(A) = 4(32bit)/8(64bit) //当 C++ 类中有虚
函数的时候,会有⼀个指向虚函数表的指针(vptr)
class A{static int a; }; sizeof(A) = 1;
class A{int a; }; sizeof(A) = 4;
class A{static int a; int b; }; sizeof(A) = 4;
![](https://csdnimg.cn/release/download_crawler_static/88857627/bg14.jpg)
就是把客观事物封装成抽象的类,并且类可以把⾃⼰的数据和⽅法只让信任的类或者对象操
作,对不可信的进⾏信息隐藏。⼀个类就是⼀个封装了数据以及操作这些数据的代码的逻辑实
体。在⼀个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种⽅式,
对象对内部数据提供了不同级别的保护,以防⽌程序中⽆关的部分意外的改变或错误的使⽤了
对象的私有部分。
所谓继承
是指可以让某个类型的对象获得另⼀个类型的对象的属性的⽅法。它⽀持按级分类的概念。继
承是指这样⼀种能⼒:它可以使⽤现有类的所有功能,并在⽆需重新编写原来的类的情况下对
这些功能进⾏扩展。通过继承创建的新类称为“⼦类”或者“派⽣类”,被继承的类称为“基类”、
“⽗类”或“超类”。继承的过程,就是从⼀般到特殊的过程。要实现继承,可以通过“继承”和“组
合”来实现。
继承概念的实现⽅式有两类:
实现继承:实现继承是指直接使⽤基类的属性和⽅法⽽⽆需额外编码的能⼒。
接⼝继承:接⼝继承是指仅使⽤属性和⽅法的名称、但是⼦类必需提供实现的能⼒。
所谓多态
就是向不同的对象发送同⼀个消息,不同对象在接收时会产⽣不同的⾏为(即⽅法)。即⼀个
接⼝,可以实现多种⽅法。
多态与⾮多态的实质区别就是函数地址是早绑定还是晚绑定的。如果函数的调⽤,在编译器编
译期间就可以确定函数的调⽤地址,并产⽣代码,则是静态的,即地址早绑定。⽽如果函数调
⽤的地址不能在编译器期间确定,需要在运⾏时才确定,这就属于晚绑定。
22、多态的实现
多态其实⼀般就是指继承加虚函数实现的多态,对于重载来说,实际上基于的原理是,编译器
为函数⽣成符号表时的不同规则,重载只是⼀种语⾔特性,与多态⽆关,与⾯向对象也⽆关,
但这⼜是 C++中增加的新规则,所以也算属于 C++,所以如果⾮要说重载算是多态的⼀种,
那就可以说:多态可以分为静态多态和动态多态。
剩余300页未读,继续阅读
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/de619685fec6466cb9400129aae62657_congwang3960.jpg!1)
学习,学习,在学习
- 粉丝: 43
- 资源: 6
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 中国微型数字传声器:技术革新与市场前景
- 智能安防:基于Hi3515的嵌入式云台控制系统设计
- 手机电量低时辐射真增千倍?解析手机使用谣言
- 56F803型DSP驱动的高精度大功率超声波电源控制策略研究
- ARM与GPRS结合的远程监测系统设计
- GPS与RFID技术结合的智能巡检系统设计
- CPLD驱动的低功耗爆炸场温度测试系统设计
- 基于FPGA的智能驱动控制系统:可扩展设计与工业网络协议
- 基于ATmega128和CH374的嵌入式USB接口设计
- 基于AT89C52的温度补偿超声波测距仪:高精度设计与应用
- MSP430F448单片机在交流数字电压表中的应用
- 提升变频器应用效率的12项实用技巧
- STM32F103在数字电镀电源并联均流系统中的应用
- PSpice仿真下的升压开关电源设计:拓扑分析与CCM稳定性提升
- 轻巧高效:MSP430主导的低成本无线传感器网络节点设计
- FPGA在EDA/PLD中实现LVDS接口的应用解析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)