

一、第1题 类(Class)的基础知识
题目:
下列关于 C++ 中类的描述,正确的是( )
A. 如果类没有用户声明的构造函数,那么编译器会隐式声明一个默认构造函数
B. 类的析构函数可以被重载,一个类可以有多个析构函数
C. 类中的所有成员都必须声明为 public
D. 类和结构体在 C++ 中没有区别,包括默认访问权限也相同
答案:A
1、第一步:什么是构造函数?
(1)想象:
你开了一家宠物店。
class Dog
{
};
(2)当你写:
Dog d;
系统需要创建一个小狗对象。
(3)那么问题来了:
谁来负责"出生"这只小狗?
(4)答案:
构造函数。
2、第二步:如果你没写构造函数怎么办?
(1)例如:
class Dog
{
};
里面啥都没有。
(2)此时:
Dog d;
仍然能运行。
为什么?
(3)因为编译器偷偷帮你补了一个:
Dog()
{
}
(4)这就叫:
默认构造函数
所以 A 正确。
3、为什么B错?
析构函数负责对象死亡。
(1)格式固定:
~Dog()
{
}
一个类只能有一个析构函数。
(2)不能写:
~Dog();
~Dog(int x);
(3)所以不能重载。
B错误。
4、为什么C错?
(1)类成员可以:
public:
private:
protected:
(2)例如:
class Dog
{
private:
int age;
};
完全合法。
所以 C 错。
5、为什么D错?
有的同学容易掉坑。
(1)看:
class Dog
{
int age;
};
默认是:
private
(2)而:
struct Dog
{
int age;
};
默认是:
public
(3)所以 class 和 struct 不是完全一样。
D错误。
6、本题总结
记住一句口诀:
不写构造编译器补,
析构只能有一个,
类默认 private,
结构体默认 public。
二、第2题 多态(虚函数)
答案:B
1、题目现象
(1)代码:
Shape* s1 = new Circle();
Shape* s2 = new Rectangle();
s1->draw();
s2->draw();
(2)输出:
绘制圆形
绘制矩形
为什么?
2、故事理解
(1)有三个角色:
Shape(图形爸爸)
↓
Circle(圆形儿子)
↓
Rectangle(矩形儿子)
(2)爸爸说:
virtual void draw()
{
}
virtual 表示:
以后谁来调用,就听对象自己的。
(3)例如:
Shape* p = new Circle();
虽然 p 的类型是 Shape*
但实际指向:
Circle
于是:
p->draw();
调用:
Circle::draw()
(4)这就叫:
多态
同一句命令:
draw();
不同对象执行不同动作。
3、为什么是B?
因为:
virtual void draw()
被声明成了虚函数。
这才产生多态。
所以选 B。
三、第3题 哪一行会编译错误?
答案:C(第③行)
1、代码:
private:
string name;
(1)说明:
name
是私有成员。
(2)外面写:
cat.name = "大橘";
等于:
偷偷闯进别人家保险柜。
(3)编译器立刻阻止:
error
2、生活例子
(1)小猫对象:
Pet cat;
(2)内部:
private:
string name;
(3)相当于:
小猫的日记本。
(4)外面的人:
cat.name
不能直接翻。
(5)必须通过:
getName()
或者:
setName()
访问。
(6)所以:
③报错。
选C。
四、第4题 循环队列
答案:A
这一题非常经典。
1、先理解队列
(1)队列像买奶茶,先来的先买:
1 2 3 4
↑
front
(2)容量:
MAX=5
采用:
空一格判满
所以实际上:
最多存4个元素。
2、初始
front=0
rear=0
3、入队4次
enqueue(1)
enqueue(2)
enqueue(3)
enqueue(4)
变成:
[1][2][3][4][ ]
此时:
front=0
rear=4
4、出队两次
删掉:
1
2
得到:
[ ][ ][3][4][ ]
位置:
front=2
rear=4
5、再入队
加入5:
rear=(4+1)%5=0
加入6:
rear=(0+1)%5=1
最终:
front=2
rear=1
6、判断是否满:
公式:
(rear+1)%MAX==front
代入:
(1+1)%5=2
成立。
7、所以:
队列已满。
rear=1
答案A。
五、第5题 循环队列应用
答案:D
1、生产者、消费者问题
想象:
(1)妈妈不断做包子。
生产者
(2)顾客不断吃包子。
消费者
(3)桌子容量有限:
[ ][ ][ ][ ]
(4)吃完的位置还能继续放。
这正是:
循环利用空间。
所以:
循环队列最适合。
2、其它选项
A
函数调用
用栈。
B
表达式求值
也是栈。
C
优先级调度
一般用优先队列。
所以 D 正确。
六、第6题 BST(二叉搜索树)
答案:B
1、已知:
中序:
1 2 3 4 5
根:
3
2、BST有个超级重要性质:
中序遍历一定升序
所以:
3
/ \
1,2 4,5
3、为什么B正确?
4和5不可能是兄弟。
(1)因为 BST 中:
4
\
5
(2)或者
5
/
4
(3)一定是祖先和孩子关系。
不会共同拥有一个父亲。
所以 B 正确。
4、反例
(1)如果:
X
/ \
4 5
(2)那么:
X 必须:
4 < X < 5
(3)只能是:
4.5
(4)但树里没有这个数。
因此不可能。


七、第7题 先序+中序求后序
答案:A
1、这是树的经典题。
(1)先序:
A B D H I E C F J G
(2)中序:
H D I B E A F J C G
2、第一步 找根
(1)先序第一个:
A
(2)所以:
A
是根。
3、第二步 分左右子树
(1)中序:
H D I B E | A | F J C G
(2)左边:
H D I B E
(3)右边:
F J C G
(4)继续递归拆。
最终得到树。
(5)后序:
规则:
左
右
根
(6)结果:
H I D E B J F G C A
答案A。
4、考试技巧
看到:
先序 + 中序
立刻想到:
能唯一建树。
然后:
求后序。
八、第8题 树遍历知识
答案:C
1、为什么C对?
已知:
(1)先序
根 左 右
(2)中序
左 根 右
(3)两个序列一起:
能够唯一还原二叉树。
这是数据结构经典结论。
2、为什么B错?
先序+后序:
很多时候不唯一。
(1)例如:
1
/
2
和
1
\
2
(2)先序:
1 2
(3)后序:
2 1
(4)两个树,先序+后序:完全一样。
却是两棵不同的树。
3、为什么D错?
只有先序:
可能有无数棵树。
不能唯一确定。
4、为什么A错?
(1)普通树 DFS 时:
孩子访问顺序不同,
结果也不同。
(2)例如:
A
├B
└C
可以:
A B C
也可以:
A C B
所以不唯一。
第一部分1~8题知识总结
这8题考查了六级核心的内容:
| 题号 | 知识点 |
|---|---|
| 1 | 类、构造函数、析构函数 |
| 2 | 虚函数、多态 |
| 3 | private封装 |
| 4 | 循环队列 |
| 5 | 队列应用 |
| 6 | BST性质 |
| 7 | 先序+中序还原二叉树 |
| 8 | 树遍历唯一性 |







