没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
12页
自己秋招根据面经和基础知识学习总结的知识点,主要内容包括但不限于:volatile关键字、sizeof & strlen、const的作用、enum、inline、delete[] 与 delete、多态的作用、C++与Python的区别、深拷贝与浅拷贝、extern C、C++内存管理、封装 / 继承 / 多态、引用 & 指针、重载与重写、右值引用、智能指针、整形字面量...... 对于C/C++/C++11/C++14的内容都有涉及,但肯定没法做到100%知识点全覆盖,可以根据自己需要后续添加内容。
资源推荐
资源详情
资源评论
C
volatile关键字
作用:
告诉编译器所修饰的变量随时可能发生变化,每次使用时都需要到源地址访问,禁止编译器进
行编译优化
编译器优化时如果两次对同一变量使用的代码之间没有对该变量进行过操作,那么就会直接将
第一次取得的值直接放到第二次使用的位置,而不是访问源地址读取,如果该变量是一个寄存
器或者端口数据就容易出错
应用场景:
并行设备的硬件寄存器,如状态寄存器
一个中断服务子程序中会访问到的非自动变量
多线程应用中被几个任务共享的变量
问题:
volatile变量可以是const属性吗?
可以,也有只读的状态寄存器,volatile旨在告诉编译器它可能意想不到地被改变,而const主
要目的是告诉程序不要试图修改它
volatile可以修饰指针吗?
可以,比如一个中断服务子程序修改一个指向buffer的指针,因此指针也可能因为中断等发生
改变
sizeof & strlen
sizeof() 是操作符,strlen是库函数
sizeof()计算实际对象的大小,strlen计算字符串长度
strlen的参数只能是C字符串,sizeof()可以是任意定义好的数据类型
sizeof()在编译时就计算出了结果,而strlen()在运行时才能计算出来
ifndef / define / endif
防止头文件被重复引用
typedef的作用
给数据类型起个别名简化代码
掩饰复合类型,比如数组
定义平台无关性类型,比如typedef long double REAL在不支持long的平台就会被视为double
const的作用
const修饰变量或者引用
将变量或者引用声明为只读,不可修改const变量或者引用对象的值
const修饰指针
常量指针和指针常量,取决于指针声明符与const的相对位置,一个是指向的值不可修改,一
个是指针本身是个常量
const修饰函数
修饰函数返回值,避免返回值被修改
修饰函数参数,避免函数参数在函数内部被修改
修饰类成员函数,防止函数对成员变量进行修改
替代define宏定义,相比于define,const是在编译期间处理,编译器会对重复使用同一个常量的
地方进行优化,一般在内存中只有一份拷贝,而宏定义通常有若干份拷贝,并且const在编译期间
会进行类型安全检查
static的作用
面向过程中的static
1. 申请静态全局变量,存储在全局数据区,对声明变量的整个文件可见,对外部文件不可见,直
到程序运行结束时才释放
2. 申请静态局部变量,跟静态全局变量类似,但作用域仅限于函数内部
3. 静态函数,与普通函数的区别是仅对当前文件可用,且其它文件可定义同名函数,不会产生冲
突
类内的static
1. 静态数据成员:无论有多少个类对象,静态数据在程序中只分配一次内存,且可以被该类的所
有对象访问
2. 静态成员函数:为了类服务,而不是为某个类对象服务,与普通成员函数相比,内部不会隐含
this指针,因为this指针指向的是类的对象本身,而静态成员函数不与类对象相联系,因此也
无法访问非静态类成员和成员函数,由于this指针的额外开销,因此静态成员函数与类的全局
函数相比速度上会有少许的增长;
static对象的初始化:
1. 对于non-local static对象:初始化在main函数执行之前,
总结:
1. 只对声明变量的源文件可见,缩小全局函数、变量的作用域,在其它文件中可以定义同名函数
或者变量,不会产生冲突;
2. 将类成员函数、变量变成静态类型,成为类共享资源;
3. 存储在全局数据区中,扩大局部变量的生命周期
4. 静态成员函数没有this指针的额外开销,效率会略高
全局变量跟静态全局变量的异同:
相同:都是存储在静态存储区,程序运行期间有效
不同:静态全局变量的作用域仅限于当前源文件,而全局变量对于源程序的所有代码文件均可
见
注意:
静态类成员函数不能设置为虚函数,因为它不属于任何类对象或类实例,声明为虚函数没有任
何意义
静态类成员函数不能修饰为const常函数,因为静态类成员函数内部没有this指针,而const会
将this指针修饰为const,对静态类成员修饰没有任何意义
#ifdef #ifndef #if(条件预编译指令)
作用:条件预编译指令,区分条件编译不同程序段,ifdef是如果定义了对应宏变量则编译该段程
序,ifndef则相反,if是如果表达式为真,则编译该段程序
enum
是枚举类型,存储整形常量的集合,默认首个成员的数值为0,后续枚举成员的值为上一个成员加1
可以是#define宏定义的替代品,因为enum不可取址,也不会浪费额外的存储空间;还能用于定义
变量承接整形常量的值;也可以配合typedef定义一个数据类型,限制数据范围
inline
可以替换宏定义#define
相比于宏定义,在编译期间在调用处展开,并且会进行类型检查和安全检查,缺点是会增加编译时
间
派生类指针不能指向基类对象
语义混乱,派生类与基类是一个is-a的关系,派生类比基类更加具体,基类更加抽象,用基类指向
派生类指针,是多态实现的基础,而用派生类指向基类指针,比如人是基类,男人女人是派生类,
如果用派生类去指向基类,我们无法认定是男人还是女人,但我们指针是认定了男女的指针,因此
会发生语义的混乱,在实际编程中,派生类指针指向基类也没有什么必要性
野指针
成因:
指针未初始化:指针创建时没有进行初始化,指向随机内存;
指针越界访问:访问超出了申请内存的范围,或者调用函数返回了栈空间的指针或引用,在调
用结束后因为栈空间的释放而无效
指针释放后没有置空:虽然内存得到的释放,但指针仍旧指向对应的内存,也就时无效内存
使用野指针的危害:
指针未初始化:指针的指向位置是随机的,如果指向的位置没有对象,则会报错,如果刚好指
向了某一块已经申请的内存区域,则会造成程序的错误执行
指针越界访问:会触发段错误
指针释放后未置空:在释放后是一个非法的指针,访问程序会出错,但如果程序较长,后续又
对同一块内存进行了申请,会导致指针合法,且由于没有置空,无法判断指针的合法性
防范:
良好的编码规范,在创建指针时及时初始化,释放指针之后及时置空,不要返回栈空间的指针
或者引用,在使用指针前进行合法性检查
delete[] 与 delete
对于简单的内置类型,分配内存时,内存大小已经确定,系统可以记录内存大小的信息,直接释放
对于自定义的类对象数组,加个数组符号除了会释放指针指向的内存,还会调用每一个对象的析构
函数,保证类对象的内存空间都被释放
C++
C++与Python的区别
等同于解释器和编译器的区别:
解释器是一行一行地对源代码或者源代码内部形式直接进行解释执行,编译器是对代码整体进
行编译生成目标文件执行
解释器效率较低,因为同一行代码可能在解释过程中被多次调用多次经历解释的过程,编译器
一次性编译成机器能识别的语言
解释器访问变量较慢,因为标识符到存储位置的映射在运行时重复进行,编译器直接给变量分
配内存
解释器不需要额外的内存空间来存储中间代码,编译器会生成中间代码
解释器一次仅显示一次错误,就发生在解释失败的第一行,编译器一次性返回编译期间的所有
错误,可能会发生混淆
剩余11页未读,继续阅读
资源评论
梦想是优秀社畜
- 粉丝: 63
- 资源: 30
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- JSP-JTBC-CMS(SQLITE).rar
- MC3362和MC145151调频无线接收器的设计.pdf
- MiniRenamer-v100.0一款简单易用的批量文件重命名工具(已注册PRO版本).rar
- 小狐狸Ai系统 小狐狸ai付费创作系统V2.8.0 ChatGPT智能机器人
- 公孙离-内衣-肚兜.zipgsl
- 快慢指针判断链表是否有环-go 语言实现
- 学生成绩管理系统的设计与实现-收藏备用.pdf
- JSP+SQL网站流量统计管理系统(源代码+论文).rar
- IBM-PC-XT微机过程...道中模拟量数据的采集和处理.pdf
- JSP+SQL网上选课系统(源代码+论文+答辩PPT).rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功