1.1. 整体说明
1、以前的客观题考试拆分为三个部分:科目二、三、四。
2、科目二考试主要偏向编码技能和规范遵从。
3、科目二及格分数从80%调整到70%,满分135,单选2分,多选3分。
考试必读两个文档,C++通用编程规范、C++安全编程规范,这两个规范占分数40%
其他的60%就是C++基本功了:基本语法和特性、并发编程、面向对象、标准库、c++11高级特性(占比很低,可战略放弃)。
1.2. 易错真题
- namespace支持跨文件
- 匿名 Namespace和static 都可以匿名化,也就是不导出符号。
匿名 Namespace和static 的区别
https://blog.csdn.net/weixin_30399797/article/details/99626783
- 类似连乘符号的实现,可参考std::string& std::sting.append(const char*),注意传入const返回引用。
- 虚函数表vtbl和函数表指针vptr。
(非继承的类)
如果一个类中有虚函数,则该类就有一个虚函数表。虚函数表是属于类的,不属于类对象。在编译的时候确定,存放在只读数据段(不是代码段)。
每一个实例化的类对象都有一个虚函数表指针,指向类的虚函数表。虚函数表指针属于类对象。存放在堆上或者栈上。
(继承的类)
如果基类中有虚函数,派生类实现或没实现,都有虚函数表。基类的虚函数表和派生类的虚函数表不是同一个表。
如果派生类没有重写基类的虚函数,则派生类的虚函数表和基类的虚函数表的内容是一样的。
如果派生类重写了基类的虚函数,则在派生类的虚函数表中用的是派生类的函数。
(多继承)
含有虚函数的基类有多少个,派生类就有多少个虚函数表指针,派生类有就有多少个虚函数表。
派生类有的而基类没有的虚函数,添加在第一个虚函数表中。
虚函数表的结果是* 表示还有下一个虚函数表
虚函数表的结果是0 表示是最后一个虚函数表
- 数组作为参数传递,下标是否该传进来,这个好像是安全规范里有,待查下。
- C++11新特性的使用是否规范:auto、shared_ptr、override、virtual。这里有个规范要查下:子类要不要写virtual了,我们一般为了后续方便都写了,但规范可能不这么认为。
- memset_s能否用于对象。
- shared_ptr互相引用后,如何析构?
- operator delete 和 operator delete[] 是不同的运算符
- const std::string str; 的行为是什么?Str是否还需要初始化?
- 枚举数组能否通过static_cast强行赋值一个枚举范围外的值?
- 整数向上转换 考了好几道
unsigned + short = int or short?
Int a; unsinged b; auto c = a+b; c是什么类型
- 整数溢出
- C++内存分布
栈区(stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
堆区(heap) : 一般由程序员分配释放, 若程序员不释放,在程序结束时,操作系统回收。
BSS段(Block Started by Symbol):.bss段被用来存放那些没有初始化或者初始化为0的全局变量。bss段只占运行时的内存空间而不占文件空间。在程序运行的整个周期内,.bss段的数据一直存在
全局区(静态区):全局变量和静态变量的存储是放在一块的, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 在程序序结束后由系统释放。
DATA区(初始化的数据段):为数据分配空间,数据保存在目标文件中
文字(只读)常量区 :常量字符串就是放在这里的。 程序结束后由系统释放
代码段(TXT):存放函数体的二进制代码
- Explicit关键字
https://blog.csdn.net/ChaseRaod/article/details/77933828
C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。
由于带参数的构造函数并不会继承,所以,explicit也不会继承。
- 可重入方法 好像也考了不止一道
可重入:除了使用自己栈上的变量以外不依赖于任何环境。
不可重入函数是否具有传递性? A不可重入,那么调用A的B是否可重入?无聊的题目,我觉得也不可重入。
- Inline的强制性
非强制的,编译器会自己优化
- 自包含
Include a.h后,不需要再include其他头文件就可以编译通过。
1.3. 没啥意义的考试题(为了考试可学,但太偏了,用不到)
- relloc相关题目,长度为0会怎么样?
- 重载带参数的new 、 delete
new (“string”) object();
- 模板类生成规则,各种函数是否会生成同一个模板类:全局函数、类函数、lamda对象重载函数
- 运算符的优先级 int i=3;std::cout << -i++;
- 所有的for都可以用while代替吗?