🏠 返回首页 📖 学习网页

🧪 C++ 程序设计 · 考试题库

基于课堂课件与教材 · 共 99 道题

📝 总题数 99 ✅ 已答 0 ✔️ 正确 0 ❌ 错误 0

📘 第一章 C++ 初步知识

一、选择题

1 必考重点 2分
在 C++ 中,有关 cincout 的叙述正确的是?
✅ 答案:B
cin/cout 在 iostream 头文件中声明,使用标准库需 using namespace std。
2 必考重点 2分
函数重载要求以下哪项不同?
✅ 答案:A
重载允许函数同名但参数个数或类型不同。仅返回值不同不允许,系统无法区分。
3 必考重点 2分
下列关于引用的说法,错误的是?
✅ 答案:C
不能建立引用的数组,数组是一组连续空间,引用是别名不占据独立空间。
4 常考掌握 2分
关于函数模板,以下说法正确的是?
✅ 答案:D
参数个数不同不能用模板。模板声明可用 typename 或 class 关键字,实参类型可自动推导。

二、判断题

5 常考掌握 1分
using namespace std; 的作用是使用命名空间 std,标准库中的类和函数是在 std 中声明的。
✅ 答案:正确
6 必考重点 1分
函数重载允许两个函数的函数名、参数个数、参数类型完全相同,仅返回值不同。
✅ 答案:错误
不允许参数个数、参数类型都相同,仅返回值不同。系统从调用形式上无法判断匹配哪个函数。
7 必考重点 1分
有默认参数的函数的形参必须放在形参表的最右边。
✅ 答案:正确
有默认值的形参必须放在形参表右侧,不允许无默认值和有默认值交错排列。
8 常考掌握 1分
在 C++ 中,const float PI = 3.14159; 是用 const 定义的常变量,比 #define 更安全(有类型检查)。
✅ 答案:正确

三、填空题

9 常考掌握 1分
在 C++ 中,使用 cout 和 cin 时需要包含头文件 ______。
✅ 答案:<iostream>
10 基础了解 1分
C++ 中代表换行的运算符是 ______,也可以用 "\n" 代替。
✅ 答案:endl
11 常考掌握 1分
C++ 标准规定 main 函数的类型必须是 ______ 类型。
✅ 答案:int
12 必考重点 1分
C++ 为变量取别名的功能称为变量的 ______ ,格式为 类型 &别名 = 变量名
✅ 答案:引用
13 常考掌握 1分
C++ 规定,如果函数调用在函数定义之前,需要在调用前进行 ______ 声明。
✅ 答案:函数原型
67 常考掌握 1分
new 分配数组后,释放时应该用 delete[]
✅ 答案:正确
new 分配数组后必须用 delete[] 释放,用 delete 会导致未定义行为。
68 常考掌握 1分
在 C++ 中,new 运算符动态分配内存后返回的是 ______。
✅ 答案:指针
new 返回指向所分配内存的指针,例如 int *p = new int(5);
69 常考掌握 2分
以下关于 inline 函数的说法正确的是?
✅ 答案:C
类内定义的成员函数默认是 inline 函数。inline 是编译时展开,递归和复杂循环通常不被编译器内联。
70 常考掌握 2分
以下哪种情况必须使用作用域运算符 ::
✅ 答案:C
类外定义成员函数必须用 :: 指明所属类,格式为"返回类型 类名::函数名(参数)"。
71 必考重点 2分
以下哪种参数传递方式能改变实参的值?
✅ 答案:C
引用传递时形参是实参的别名,对形参的修改直接影响实参。值传递不改变实参,传指针虽可间接修改但不改变指针本身。
72 常考掌握 1分
const 定义的常变量必须在 ______ 时初始化。
✅ 答案:定义
const 变量在定义时就必须初始化,之后不能再赋值修改。

📗 第二章 类和对象

(原Q13-Q24编号不变,以下Q14为新编号)

一、选择题

13 必考重点 2分
在 C++ 中,类定义默认的访问权限是?
✅ 答案:B
class 默认是 private,与 struct 默认 public 不同。
14 必考重点 2分
下列有关类和对象的说法正确的是?
✅ 答案:D
类是抽象的(不占内存),对象是具体的(占内存)。类是模板,对象是实例。
15 常考掌握 2分
在类外定义成员函数时,需要使用作用域运算符,格式为?
✅ 答案:C
格式:类型 类名::函数名(参数表) { }。
16 必考重点 2分
访问对象成员的方式不包括以下哪种?
✅ 答案:B
三种访问方式:对象名.成员名、指针->成员名、对象的引用.成员名。类名::成员名用于访问静态成员。

二、判断题

17 必考重点 1分
同一个类的所有对象共享同一个成员函数空间,系统只为每个对象的数据成员分配内存。
✅ 答案:正确
18 常考掌握 1分
在类定义中可以给数据成员赋初值,如 int x = 5; 是允许的。
✅ 答案:错误
类只是定义一种结构(样板),不分配存储空间,因此不能对数据成员初始化。

三、填空题

19 必考重点 1分
面向对象程序设计四大特征是:抽象、______、继承、多态。
✅ 答案:封装
20 常考掌握 1分
类定义结束时,末尾的 ______(标点符号)不能忘记。
✅ 答案:分号(;)
21 常考掌握 1分
结构体 struct 默认访问权限是 ______(填 public 或 private)。
✅ 答案:public
struct 默认 public,class 默认 private。
22 基础了解 1分
调用对象中的函数就是向对象传递一个 ______,要求对象执行某个操作。
✅ 答案:消息
23 基础了解 1分
在类内定义的成员函数默认是 ______ 函数。
✅ 答案:inline(内置/内联)
24 常考掌握 1分
类的成员访问权限中,______ 权限表示成员可在本类和派生类中访问,但不能在类外访问。
✅ 答案:protected(保护)
25 常考掌握 1分
在 C++ 中,struct 和 class 的默认访问权限都是 private。
✅ 答案:错误
struct 默认 public,class 默认 private。这是两者在 C++ 中唯一的本质区别。
73 必考重点 2分
关于 this 指针的说法正确的是?
✅ 答案:B
this 指针指向当前调用成员函数的对象自身,不能在静态成员函数中使用,也不能被赋值修改。
74 必考重点 1分
每个对象的成员函数中都隐含一个 this 指针。
✅ 答案:正确
非静态成员函数中都隐含 this 指针(作为第一个参数传入),指向调用该函数的对象。
75 常考掌握 2分
C++ 中 structclass 的区别是?
✅ 答案:C
struct 默认访问权限是 public,class 默认是 private。这是两者在 C++ 中唯一的本质区别。
76 常考掌握 1分
可以用对象指针通过 -> 运算符访问对象的公有成员。
✅ 答案:正确
对象指针通过 -> 访问公有成员是 C++ 的标准用法,格式为 指针->成员名。
77 常考掌握 2分
使用动态数组 vector 需要包含的头文件是?
✅ 答案:B
vector 定义在头文件 <vector> 中,使用时需要 #include <vector>。

📙 第三章 关于类和对象的进一步讨论

(原Q25-Q36编号不变,以下Q26为新编号)

一、选择题

25 必考重点 2分
关于构造函数,下列说法错误的是?
✅ 答案:B
构造函数没有返回值,也不需要写 void。
26 必考重点 2分
析构函数的特点是?
✅ 答案:A
析构函数名为 ~类名,无返回值、无形参、不能重载,一个类只有一个析构函数。
27 必考重点 2分
下列有关构造和析构函数调用顺序的说法正确的是?
✅ 答案:C
类似栈结构:后进先出。先构造的对象后析构,后构造的对象先析构。
28 常考掌握 2分
关于静态数据成员,以下说法正确的是?
✅ 答案:C
静态成员被所有对象共享,必须在类外定义和初始化,可以用 类名::静态成员名 访问。

二、判断题

29 必考重点 1分
如果用户没有定义构造函数,C++ 系统会自动生成一个空函数体的默认构造函数。
✅ 答案:正确
30 常考掌握 1分
一个类的多个构造函数中,创建对象时可以选择多个构造函数同时执行。
✅ 答案:错误
一个类可以有多个构造函数,但创建对象时系统仅执行其中一个。
31 常考掌握 1分
友元关系可以传递。如果 A 是 B 的友元,B 是 C 的友元,则 A 也是 C 的友元。
✅ 答案:错误
友元关系是单向的,不能传递。
32 常考掌握 1分
静态成员函数不能直接访问非静态数据成员。
✅ 答案:正确
静态成员函数属于类,与具体对象无关,因此不能直接访问非静态成员(非静态成员属于具体对象)。

三、填空题

33 必考重点 1分
构造函数的名称必须与 ______ 相同。
✅ 答案:类名
34 常考掌握 1分
析构函数名在类名前加 ______ 符号。
✅ 答案:~(波浪号)
35 常考掌握 1分
对于功能相同但数据类型不同的类,可以定义 ______ 来避免重复代码。
✅ 答案:类模板
36 常考掌握 1分
C++ 中用关键字 ______ 声明友元函数或友元类。
✅ 答案:friend

📕 第四章 运算符重载

一、选择题

37 必考重点 2分
下列运算符中,不能重载的是?
✅ 答案:D
不能重载的 5 个运算符:. .* :: sizeof ?:
38 必考重点 2分
要将 cout << 对象 用于自定义类,应重载哪个运算符?
✅ 答案:C
流插入运算符 << 和流提取运算符 >> 只能重载为友元函数,因为第一个形参必须是 ostream& 或 istream&,不是自定义类型。
39 常考掌握 2分
运算符重载不能改变的是?
✅ 答案:A
重载不改变优先级和结合性、不改变操作数个数。不能臆造新运算符。

二、判断题

40 必考重点 1分
重载运算符可以改变操作数的个数。
✅ 答案:错误
重载不能改变操作数的个数,例如 + 永远是双目运算符。
41 常考掌握 1分
重载为友元函数时,参数个数等于原操作数个数。
✅ 答案:正确
重载为成员函数时参数个数 = 原操作数个数 - 1(少一个当前对象)。友元函数参数个数 = 原操作数个数。
42 常考掌握 1分
运算符重载函数可以带默认值参数。
✅ 答案:错误
运算符重载函数不能带默认值参数。
43 必考重点 1分
运算符重载函数名由关键字 ______ 和运算符联合组成。
✅ 答案:operator
44 常考掌握 1分
后置自增运算符 ++ 重载时函数参数类型为 ______(占位参数,仅用于区分)。
✅ 答案:int
后置++ 的形参写 int(不传值),仅用于和前置++区分。

📘 第五章 继承与派生

一、选择题

45 必考重点 2分
派生类构造函数的执行顺序是?
✅ 答案:C
派生类构造函数执行顺序:①基类构造函数 ②子对象构造函数 ③派生类构造函数体。
46 必考重点 2分
多重继承中,派生类构造函数的调用顺序取决于?
✅ 答案:B
系统调用基类构造函数的顺序就是声明派生类时基类的出现顺序。
47 必考重点 2分
解决菱形继承(A->B, A->C, B,C->D)二义性的方法是?
✅ 答案:D
菱形继承中基类被继承多次,用虚基类(virtual)使派生类只保留一份共同基类成员。

二、判断题

48 必考重点 1分
派生类对象可以赋值给基类对象,但反之不行。
✅ 答案:正确
基类对象不具有派生类的所有成员,所以基类不能赋值给派生类。
49 常考掌握 1分
派生类的析构函数执行顺序与构造函数相反:先执行派生类析构,再调用子对象析构,最后调用基类析构。
✅ 答案:正确
50 必考重点 1分
派生类可以通过基类指针访问基类的成员,但不能访问派生类新增的成员。
✅ 答案:正确
通过基类指针只能使用从基类继承的成员,无法访问派生类新增的成员。

三、填空题

51 常考掌握 1分
多层派生写构造函数时,只须调用其 ______ 的构造函数即可。
✅ 答案:直接基类
52 必考重点 1分
声明虚基类的关键字是 ______。
✅ 答案:virtual
53 常考掌握 1分
派生类不能继承基类的构造函数、析构函数和______。(填一种不能继承的东西)
✅ 答案:友元函数(或重载的=运算符、赋值运算符函数等)
54 常考掌握 1分
在多重继承中,最终的 ______(填"基类"或"派生类")负责对虚基类进行初始化。
✅ 答案:派生类
最终派生类不仅要负责对其直接基类初始化,还要负责对虚基类初始化。
55 常考掌握 1分
派生类构造函数中,必须写出基类构造函数及其参数,无论基类是否定义了带参构造函数。
✅ 答案:错误
如果基类没有定义构造函数,或定义了无参构造函数,派生类可以不写基类构造函数,系统自动调默认构造函数。
56 基础了解 1分
继承是"is-a"关系(学生是一种人),组合是"has-a"关系(班级里有学生)。
✅ 答案:正确

📗 第六章 多态性与虚函数

(原Q55-Q64编号不变,以下Q57为新编号)

一、选择题

57 必考重点 2分
以下哪种方式实现的是动态多态性?
✅ 答案:C
静态多态通过函数重载和运算符重载实现(编译时确定);动态多态通过虚函数实现(运行时确定)。
58 必考重点 2分
以下关于虚函数的说法正确的是?
✅ 答案:D
构造函数不能是虚函数。只有成员函数能声明为虚函数。虚函数在派生类中不强制重新定义。D 描述的是虚函数的核心功能——动态关联。
59 常考掌握 2分
有虚函数的对象比无虚函数的对象占用更多空间,原因是?
✅ 答案:B
编译系统在带虚函数的类中增加一个 VPTR 指针(指向函数指针表),因此对象占用的内存增大。

二、判断题

60 必考重点 1分
当基类指针指向派生类对象时,通过该指针调用虚函数会调用派生类的版本。
✅ 答案:正确
这就是虚函数的核心功能——动态关联。实际调用哪个函数在运行时根据对象的实际类型确定。
61 常考掌握 1分
抽象类不能定义对象,但可以声明指向抽象类的指针和引用。
✅ 答案:正确
抽象类不能实例化,但可以声明指针和引用,指向派生类对象,实现多态。
62 常考掌握 1分
纯虚函数与函数体为空的虚函数是一样的。
✅ 答案:错误
纯虚函数根本没有函数体,所在的类不能实例化(抽象类)。空的虚函数有函数体,所在类可以实例化。

三、填空题

63 必考重点 1分
声明虚函数的关键字是 ______。
✅ 答案:virtual
64 必考重点 1分
纯虚函数的声明格式为:virtual 函数类型 函数名(参数表)=______;
✅ 答案:0
65 常考掌握 1分
带有纯虚函数的类称为 ______。
✅ 答案:抽象类
66 常考掌握 1分
构造函数不能声明为虚函数,但 ______ 可以声明为虚函数。
✅ 答案:析构函数(虚析构函数)

📝 简答题 综合重点

每题 5-8 分,重点考察概念理解与综合分析能力。

E1 必考重点 6分
题目:简述 C++ 中函数重载的条件。为什么不能仅靠返回值类型不同来重载?
✅ 参考答案:

条件:函数名相同,但参数个数不同或参数类型不同(或参数顺序不同)。
原因:编译器根据函数调用时传入的实参类型和个数来确定调用哪个函数。如果两个函数的函数名、参数个数、参数类型完全相同,仅返回值不同,编译器无法从调用形式上区分应该调用哪个函数。例如 int f()float f(),调用 f() 时不知道用哪个。

E2 必考重点 6分
题目:解释三种参数传递方式(值传递、指针传递、引用传递)的区别,并说明引用传递的主要优点。
✅ 参考答案:

① 值传递:将实参的值复制给形参,形参和实参各自占用独立的内存空间。函数内修改形参不影响实参。
② 指针传递:将实参的地址传递给形参,形参是指针变量。通过指针可以间接修改实参的值,调用时需取地址。
③ 引用传递:形参是实参的别名,形参和实参共享同一块内存。函数内对形参的修改直接影响实参。
引用传递的优点:比指针更直观(不需要取地址和*解引用),比值传递效率高(不产生副本),适合需要修改实参或传递大型对象时使用。

E3 常考掌握 5分
题目:什么是变量的引用?引用有哪些使用限制?
✅ 参考答案:

引用:引用是变量的别名,格式为 类型 &别名 = 变量名。引用和被引用的变量共享同一块内存空间。
限制:① 定义引用时必须初始化(不能只声明不赋值);② 一旦初始化,不能改变引用的指向;③ 不能建立引用的数组;④ 不能建立引用的引用;⑤ 不能取引用的地址。

E4 必考重点 6分
题目:简述面向对象程序设计的四大特征,并简要说明每个特征的含义。
✅ 参考答案:

① 抽象:从具体事物中提取共性特征,形成类的过程。如从"张三"、"李四"中抽象出"学生"类。
② 封装:将数据(成员变量)和操作数据的方法(成员函数)捆绑在一起,并隐藏内部实现细节,只对外开放必要的接口。通过访问权限(private/public/protected)实现。
③ 继承:派生类自动获得基类的全部成员,并可新增自己的成员。体现了"is-a"关系,提高了代码复用性。
④ 多态:同一操作作用于不同对象时产生不同的执行结果。静态多态通过函数重载实现,动态多态通过虚函数实现。

E5 必考重点 6分
题目:什么是 this 指针?它的作用是什么?在什么情况下必须显式使用 this 指针?
✅ 参考答案:

this 指针:每个非静态成员函数都有一个隐含的指针参数 this,它指向调用该函数的对象自身。当调用 obj.func() 时,编译器自动将对象的地址传递给 this。
作用:① 在成员函数中通过 this->成员 访问本对象的成员;② 返回当前对象的引用(如 return *this;)。
必须显式使用的情况:当成员函数的形参名与数据成员名相同时,必须用 this->成员 来区分。例如 void set(int x) { this->x = x; }

E6 必考重点 6分
题目:构造函数和析构函数各有什么特点?简述构造函数的调用顺序和析构函数的调用顺序。
✅ 参考答案:

构造函数特点:① 函数名与类名相同;② 没有返回值(不写 void);③ 可以重载;④ 创建对象时自动调用;⑤ 如果用户不定义,系统自动生成一个默认构造函数。
析构函数特点:① 函数名为 ~类名;② 没有返回值,没有参数;③ 不能重载(一个类只有一个析构函数);④ 对象销毁时自动调用。
调用顺序:先构造的后析构(栈式)。构造函数:基类构造函数 → 子对象构造函数 → 派生类构造函数体。析构函数:派生类析构函数 → 子对象析构函数 → 基类析构函数。

E7 必考重点 6分
题目:什么是复制构造函数?在哪些情况下会自动调用复制构造函数?如果类中有指针成员,为什么需要自己定义复制构造函数?
✅ 参考答案:

复制构造函数:用一个已存在的对象来初始化新对象时调用的构造函数。格式为 类名(const 类名 &对象),参数必须是本类对象的引用。
自动调用的情况:① 用已存在的对象初始化新对象(Box box2 = box1;);② 函数参数传值时实参传递给形参;③ 函数返回对象时。
为什么需要自己定义:默认复制构造函数执行浅拷贝(逐个成员复制)。如果类中有指针成员指向 new 出来的内存,浅拷贝会导致两个对象的指针指向同一块内存。析构时先析构的对象 delete 了内存,后析构的对象会重复 delete,导致程序崩溃。自己定义复制构造函数可以执行深拷贝(为新对象重新分配内存并复制内容)。

E8 常考掌握 5分
题目:静态数据成员和静态成员函数有什么特点?
✅ 参考答案:

静态数据成员:① 被所有对象共享,只占用一份内存空间;② 必须在类外定义和初始化(格式:类型 类名::静态成员 = 值);③ 可以通过类名访问(类名::静态成员),也可以通过对象名访问。
静态成员函数:① 属于类本身,与具体对象无关;② 可以直接通过类名调用(类名::静态函数());③ 不能直接访问非静态成员(因为非静态成员属于具体对象,静态函数没有 this 指针)。

E9 常考掌握 5分
题目:哪些运算符不能重载?运算符重载有哪些规则限制?
✅ 参考答案:

不能重载的 5 个运算符:.(成员访问运算符)、.*(成员指针运算符)、::(作用域运算符)、sizeof(长度运算符)、?:(条件运算符)。
规则限制:① 不能改变运算符的优先级和结合性;② 不能改变操作数的个数;③ 不能臆造新的运算符(只能重载已有的);④ 不能改变运算符用于基本类型时的原有语义;⑤ 重载不能带默认值参数;⑥ 重载为成员函数时参数个数 = 原操作数个数 - 1,重载为友元函数时参数个数 = 原操作数个数。

E10 常考掌握 5分
题目:为什么流插入运算符 << 和流提取运算符 >> 必须重载为友元函数形式,而不能重载为成员函数?
✅ 参考答案:

因为重载为成员函数时,第一个操作数必须是本类的对象(由 this 指针隐含传递)。而 <<>> 的第一个操作数分别是 ostream 对象(如 cout)和 istream 对象(如 cin),它们不是本类类型。所以必须重载为友元函数,将 ostream&istream& 作为第一个显式参数。
此外,重载为友元函数能保证使用习惯 cout << 对象 自然流畅,不需要写成 对象 << cout 这种反直觉的形式。

E11 必考重点 6分
题目:简述三种继承方式(public、protected、private)对基类成员在派生类中访问权限的影响。为什么 public 继承最常用?
✅ 参考答案:

三种继承方式的影响:
  ① public 继承:基类的 public 成员在派生类中仍为 public;protected 成员仍为 protected;private 成员不可访问。
  ② protected 继承:基类的 public 和 protected 成员在派生类中都变为 protected;private 成员不可访问。
  ③ private 继承:基类的所有成员(public 和 protected)在派生类中都变为 private;private 成员不可访问。
为什么 public 继承最常用:public 继承保持了"is-a"关系(如"学生是一种人"),派生类对象可以当作基类对象使用,支持向上转型和通过基类指针/引用调用派生类对象,是实现多态的基础。

E12 必考重点 6分
题目:什么是虚基类?它解决了什么问题?虚基类的构造函数如何调用?
✅ 参考答案:

虚基类:在派生类声明基类时加上 virtual 关键字,如 class B: virtual public A,A 就是虚基类。
解决的问题:菱形继承中,派生类从不同路径继承同一个基类时(如 D 继承 B 和 C,B 和 C 都继承 A),基类 A 的成员会在派生类 D 中产生两个副本,导致二义性。使用虚基类后,D 中只保留一份 A 的副本。
构造函数调用规则:如果虚基类定义了带参数的构造函数,那么所有直接或间接派生类都要在初始化表中列出虚基类构造函数。但编译系统只执行最终派生类对虚基类的构造函数调用,中间类的调用被忽略。

E13 必考重点 6分
题目:什么是多态?静态多态和动态多态的区别是什么?动态多态的实现条件有哪些?
✅ 参考答案:

多态:同一函数调用在不同的对象上产生不同的行为。
静态多态(编译时多态):通过函数重载和运算符重载实现,在编译时就确定了调用哪个函数。优点是执行效率高,缺点是灵活性差。
动态多态(运行时多态):通过虚函数实现,在运行时才确定调用哪个函数。用基类指针指向派生类对象时,根据对象实际类型调用对应版本的函数。
实现条件:① 基类中声明虚函数(使用 virtual 关键字);② 派生类中重写(override)该虚函数;③ 通过基类指针或引用调用虚函数;④ 若使用纯虚函数(= 0),基类成为抽象类,不能实例化。

E14 必考重点 5分
题目:简述"继承"和"派生"的关系。C++中派生类对基类成员的访问规则是什么?
✅ 参考答案:

继承和派生的关系(课件5.1节):继承和派生是同一个过程的两个视角。继承是从子类的角度,描述子类获得基类特性的过程;派生是从基类的角度,描述从基类产生新类的过程。两者描述的实质是同一种机制——在已有类的基础上建立新类。

访问规则(课件5.4节):
① 无论哪种继承方式,基类的 private 成员在派生类中均不可直接访问。
public 继承:基类 public 成员在派生类中保持 public,基类 protected 成员保持 protected。
protected 继承:基类 public 和 protected 成员在派生类中都变为 protected。
private 继承:基类 public 和 protected 成员在派生类中都变为 private。
⑤ 派生类可通过基类的 public/protected 成员函数间接访问基类的 private 成员(课件5.3-5.4节)。

💻 编程题 必考重点

每题 10 分,重点考察综合运用能力。

P1 必考 10分
题目:定义一个 Box 类,包含长、宽、高私有成员,设计带参数的构造函数(使用初始化表),以及计算体积的成员函数。主函数创建两个长方体对象(12,25,30)和(15,30,21),输出它们的体积。
// 参考代码
class Box {
public:
    Box(int h, int w, int len): // 初始化表
        height(h), width(w), length(len) {}
    int volume() { return height * width * length; }
private:
    int height, width, length;
};
int main() {
    Box box1(12, 25, 30);
    Box box2(15, 30, 21);
    cout << "box1体积=" << box1.volume() << endl;
    cout << "box2体积=" << box2.volume() << endl;
    return 0;
}
P2 必考 10分
题目:定义复数类 Complex(私有数据成员 real, imag),重载 + 运算符实现复数加法(使用友元函数形式),重载 << 运算符实现复数输出。主函数中创建 c1(3,4)、c2(5,-10),计算 c3 = c1 + c2 并输出。
// 参考代码
class Complex {
    friend Complex operator+(Complex &c1, Complex &c2);
    friend ostream& operator<<(ostream &out, Complex &c);
public:
    Complex(double r = 0, double i = 0): real(r), imag(i) {}
private:
    double real, imag;
};
Complex operator+(Complex &c1, Complex &c2) {
    return Complex(c1.real + c2.real, c1.imag + c2.imag);
}
ostream& operator<<(ostream &out, Complex &c) {
    out << "(" << c.real << "," << c.imag << "i)";
    return out;
}
P3 必考 10分
题目:声明基类 Student(学号、姓名),派生类 Student1(增加年龄),Student2(再增加成绩)。写出多层派生时各构造函数的写法。主函数创建 Student2 对象 stud(10010,"李明",17,89) 并输出全部数据。
class Student {
protected:
    int num; string name;
public:
    Student(int n, string nam): num(n), name(nam) {}
    void display() { cout<<"num:"<" name:"<class Student1: public Student {
protected: int age;
public:
    Student1(int n, string nam, int a): Student(n, nam), age(a) {}
};
class Student2: public Student1 {
    int score;
public:
    // 只须调用直接基类 Student1 的构造函数
    Student2(int n, string nam, int a, int s): Student1(n, nam, a), score(s) {}
    void show_all() { display(); cout<<"age:"<" score:"<
            
P4 必考 10分
题目:写一个利用引用实现两数交换的函数,并说明引用的作用。
// 引用作为函数参数(形参是实参的别名)
void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}
// 调用时直接传变量(不用取地址)
int i = 3, j = 5;
swap(i, j);  // i=5, j=3
P5 必考 10分
题目:设计一个基类 Shape,包含纯虚函数 area()。派生类 Circle 实现面积计算。展示利用基类指针实现多态的用法。
class Shape {
public:
    virtual void area() = 0;  // 纯虚函数
};
class Circle: public Shape {
    float r;
public:
    Circle(float rr): r(rr) {}
    void area() { cout << 3.14 * r * r; }
};
void fun(Shape *ptr) { ptr->area(); }  // 动态关联
// 使用:
Circle c(15);
Shape *p = &c;
fun(p);  // 输出 Circle 的 area
P6 常考 10分
题目:用函数模板实现求两个数中大数的函数,分别用 int、float、char 类型测试。
template <typename T>
T my_max(T a, T b) {
    return (a > b) ? a : b;
}
// 测试
cout << my_max(3, 7) << endl;          // int → 7
cout << my_max(45.78, 93.6) << endl;     // float → 93.6
cout << my_max('a', 'A') << endl;       // char → 'a'

✅ 汇总答案

方便考前快速核对,标 为必考重点。

题号答案题号答案题号答案
1B2A3C
4D5正确6错误
7正确8正确9<iostream>
10endl11int12引用
13函数原型14B15D
16C17B18正确
19错误20封装21分号(;)
22public23消息24inline
25错误26B27A
28C29C30正确
31错误32正确33错误
34正确35类名36~
37类模板38friend39D
40C41A42错误
43正确44错误45operator
46int47C48B
49D50正确51正确
52正确53直接基类54virtual
55友元函数56派生类57错误
58正确59C60D
61B62正确63正确
64错误65virtual660
67抽象类68析构函数69正确
70指针71C72C
73C74定义

编程题参考代码和简答题参考答案已在题目下方给出,请理解后默写练习。

📖 基于课堂课件与教材出题 · 考前复习利器