c++基础
温馨提醒
c++基础题目(1)
题目列表
1. 以下说法中正确的是( )。
- 答案:C
- 选项
- A. 基类的私有成员在派生类的对象中不可访问,也不占内存空间
- B. 封装性指的是将不同类型的相关数据组合在一起,作为一个整体进行处理
- C. 在面向对象的程序设计中,结构化程序设计方法仍有着重要作用
- D. 多态性指的是对象的状态会根据运行时要求自动变化
- 易错解释
- A. 错误。基类的私有成员在派生类中不可访问,但仍然占用内存空间。
- B. 错误。封装性指的是将数据和操作数据的方法绑定在一起,形成一个独立的单位。
- D. 错误。多态性指的是同一接口可以有不同的实现形式。
2. 执行以下程序后,输出的结果是( )。
- 答案:D
- 选项
- A. 1.25
- B. 0
- C. 1.3
- D. 1
- 易错解释
- A. 错误。
b/a
是整数除法,结果为1,再转换为浮点数仍然是1.0。 - B. 错误。整数除法的结果不可能是0。
- C. 错误。
b/a
的结果为1,而不是1.3。
- A. 错误。
3. 以下描述不正确的是( )。
- 答案:B
- 选项
- A. break语句在一层循环体中可出现多次
- B. break语句可用在if语句中,它可使执行的流程跳出当前的if语句
- C. break语句可用在循环体中,它将是执行的流程跳出本层循环
- D. break语句可用在switch语句中,它使执行的流程跳出当前switch语句
- 易错解释
- B. 错误。
break
语句不能用于跳出if
语句,只能用于跳出循环或switch
语句。
- B. 错误。
4. 以下描述不正确的是( )。**
- 答案:A
- 选项
- A. 相同类型的指针之间可以相互赋值
- B. 指针中存放的实际上是内存单元的地址
- C. 可以在指针定义的同时对其进行初始化
- 易错解释
- A. 错误。相同类型的指针之间可以相互赋值,但不同类型的指针之间不能直接赋值,需要进行类型转换。
5. 以下说法中正确的是( )。
- 答案:C
- 选项
- A. 当动态分配内存失败时,系统会立刻崩溃,因此一定要慎用new
- B. C++语言只能用new和delete用于动态内存分配和释放的函数
- C. 动态分配的内存空间也可以被初始化
- D. 当系统内存不够时,会自动回收不再使用的内存单元,因此程序中不必用delete释放内存空间
- 易错解释
- A. 错误。动态分配内存失败时,
new
会抛出异常或返回nullptr
,但不会导致系统崩溃。 - B. 错误。C++ 中除了
new
和delete
,还可以使用malloc
和free
进行动态内存管理。 - D. 错误。C++ 不提供自动垃圾回收机制,必须手动释放内存。
- A. 错误。动态分配内存失败时,
6. 以下说法中不正确的是( )。
- 答案:C
- 选项
- A. 构造函数可以对静态数据成员进行初始化
- B. 构造函数可以重载
- C. 构造函数不可以设置默认参数
- D. 构造函数可以在说明类变量时自动执行
- 易错解释
- C. 错误。构造函数可以设置默认参数,这样在创建对象时可以省略部分参数。
7. 以下说法中不正确的是( )。
- 答案:A
- 选项
- A. 公有继承时基类中的private成员在派生类中仍是private的
- B. 保护继承时基类中的public成员在派生类中是protected的
- C. 公有继承时基类中的public成员在派生类中仍是public的
- D. 私有继承时基类中的public成员在派生类中是private的
- 易错解释
- A. 错误。公有继承时,基类中的
private
成员在派生类中不可访问,而不是保持private
。
- A. 错误。公有继承时,基类中的
8. 以下说法中不正确的是( )。
- 答案:B
- 选项
- A. 如果类A是类B的友元,那么类A的所有成员函数都是类B的友元
- B. 如果类A是类B的友元,那么类B也是类A的友元
- C. 如果函数fun()被说明为类A的友元,那么在fun()中可以访问类A的私有成员
- D. 友元关系不能被继承
- 易错解释
- B. 错误。友元关系是单向的,类A是类B的友元,并不意味着类B也是类A的友元。
9. 以下程序的输出结果是( )。
- 答案:C
- 选项
- A. 7
- B. 5
- C. 6
- D. 8
- 易错解释
- A. 错误。
b++
后a
的值变为6,(*pa)++
输出6,然后a
的值变为7。 - B. 错误。
b++
后a
的值变为6,(*pa)++
输出6。 - D. 错误。
b++
后a
的值变为6,(*pa)++
输出6,然后a
的值变为7。
- A. 错误。
10. 以下程序的输出结果是( )。
11. 有如下说明: int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
则数值为9的表达式是( )。
- 答案:C
- 选项
- A. *p+=9
- B. p+8
- *C. (p+8)
- D. *p+9
- 易错解释
- A. 错误。
*p+=9
会使p
指向的值增加9,结果为10。 - B. 错误。
p+8
返回指针,而不是值。 - D. 错误。
*p+9
会使p
指向的值加9,结果为10。
- A. 错误。
12. 下列语句中,正确的是( )。
- 答案:B
- 选项
- A. char Str=“Anhui-hefei”;
- *B. char Str=“Anhui-hefei”;
- C. char Str[10]=“Anhui-hefei”;
- D. char Str[11]=“Anhui-hefei”;
- 易错解释
- A. 错误。
char Str="Anhui-hefei";
应该使用字符数组或指针。 - C. 错误。
char Str[10]="Anhui-hefei";
字符串长度超过数组长度。 - D. 错误。
char Str[11]="Anhui-hefei";
字符串长度超过数组长度。
- A. 错误。
13. 以下说法中正确的是( )。
- 答案:B
- 选项
- A. 从流中获取数据的操作称为插入操作,向流中添加数据的操作称为提取操作
- B. 与键盘、屏幕、打印机和通信端口的交互都可以通过流类来实现
- C. 输出流有一个名为open的成员函数,其作用是生成一个新的流对象
- D. cin是一个预定义的输入流类
- 易错解释
- A. 错误。从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作。
- C. 错误。
open
是文件流的成员函数,用于打开文件。 - D. 错误。
cin
是预定义的输入流对象,而不是类。
14. 执行语句序列 int n; cin>>n; switch(n) { case 1: case 2:cout<<'5'; case 3: case 4:cout<<'6';break; default:cout<<'7'; }
时,若键盘输入1,则输出结果是( )。
- 答案:C
- 选项
- A. 5
- B. 6
- C. 56
- D. 7
- 易错解释
- A. 错误。
case 1
和case 2
没有break
,会继续执行case 3
和case 4
。 - B. 错误。
case 1
和case 2
没有break
,会继续执行case 3
和case 4
。 - D. 错误。
case 1
和case 2
没有break
,会继续执行case 3
和case 4
。
- A. 错误。
15. 以下程序的输出结果是( )。
- 答案:B
- 选项
- A. *****123
- B. $$$$$123
- C. 123$$$$$
- D. 123*****
- 易错解释
- A. 错误。
cout.fill('$')
设置填充字符为$
。 - C. 错误。
cout.width(8)
设置输出宽度为8,不足部分用$
填充。 - D. 错误。
cout.fill('$')
设置填充字符为$
。
- A. 错误。
16. 以下说法中不正确的是( )。
- 答案:C
- 选项
- A. 面向对象是从现实世界中客观存在的事物出发来构造软件系统的
- B. 面向对象方法中使用了一些面向过程方法中没有的概念
- C. 面向对象方法替代了过程化程序设计方法
- D. 面向对象程序设计方法要使用面向对象的程序设计语言
- 易错解释
- C. 错误。面向对象方法并没有完全替代过程化程序设计方法,两者各有适用场景。
17. 以下说法中不正确的是( )。
- 答案:A
- 选项
- A. 使用sizeof运算符可以求得某种类型和某个变量在内存中占的字节数,不能求得某个表达式的类型在内存中所占的字节数
- B. 没有参数的两个函数是不能重载的
- C. 在C++程序中,变量值是可以改变的,变量的地址值是不能改变的
- D. 开关语句中各个case和default出现的前后次序不影响执行结果
- 易错解释
- A. 错误。
sizeof
运算符可以用于求得表达式的类型在内存中所占的字节数。
- A. 错误。
18. 以下说法中不正确的是( )。
- 答案:B
- 选项
- A. 动态联编是函数联编的一种方式,它是在运行时来选择联编函数的
- B. 函数重载和运算符重载都属于动态联编
- C. 动态联编又可称为动态多态性,是通过虚函数实现的
- D. 抽象类中至少应该有一个纯虚函数
- 易错解释
- B. 错误。函数重载和运算符重载属于静态联编,而不是动态联编。
19. 已知:B类是A类的公有继承的派生类,以下说法中不正确的是( )。
- 答案:A
- 选项
- A. A类的对象就是B类的对象
- B. B类对象可以给A类对象赋值
- C. B类对象的地址值可以给A类对象指针赋值
- D. B类对象可以给A类对象引用赋值
- 易错解释
- A. 错误。A类的对象不是B类的对象,但B类的对象可以被视为A类的对象。
20. 以下说法中正确的是( )。
- 答案:C
- 选项
- A. 字符串常量与字符常量的区别仅表现在定义形式上的不同,一个用双撇号,另一个用单撇号
- B. 增1和减1运算符不仅可以作用在变量上,也可以作用在表达式上
- C. C++程序中,通常使用const来定义符号常量,定义时必须指出类型
- D. 关系运算符可以用来比较两个字符的大小,也可以比较两个字符串的大小
- 易错解释
- A. 错误。字符串常量和字符常量不仅在定义形式上不同,它们的类型和用途也不同。
- B. 错误。增1和减1运算符只能作用在变量上,不能作用在表达式上。
- D. 错误。关系运算符可以比较两个字符的大小,但不能直接比较两个字符串的大小,需要使用字符串比较函数。
21. 已知:int swap(int &a,int &b), x=10, y=20;
下列调用 swap()
函数的语句中,编译不会报错的是( )。
- 答案:C
- 选项
- A. swap(&x,&y);
- B. swap(x+2,y+5);
- C. swap(x,y);
- D. swap(x++,++y);
- 易错解释
- A. 错误。
&x
和&y
是指针,而swap
函数需要引用参数。 - B. 错误。
x+2
和y+5
是临时表达式,不能作为引用参数。 - D. 错误。
x++
和++y
是带有副作用的表达式,不能作为引用参数。
- A. 错误。
22. void Set(A&a);
是类A中一个成员函数的说明,其中 A&a
的含义是( )。
- 答案:A
- 选项
- A. 类A的对象引用a作该函数的参数
- B. 类A的对象a的地址值作函数的参数
- C. 表达式变量A与变量a按位与作函数参数
- D. 指向类A对象指针a作函数参数
- 易错解释
- B. 错误。
A&a
是引用,而不是指针。 - C. 错误。按位与操作与函数参数无关。
- D. 错误。
A&a
是引用,而不是指针。
- B. 错误。
23. 以下说法中不正确的是( )。
- 答案:B
- 选项
- A. 运算符重载是通过对已有的运算符重新定义操作功能来实现的,它是C++语言多态性的一种表现
- B. 如果类模板的模板类型参数有多个,除第1个模板类型参数前使用关键字class,其余的模板类型参数前都不使用关键字class
- C. 虚函数有继承性,基类中说明的虚函数只要在它的派生类中与它名字相同的,一定是虚函数
- D. 一个抽象类中可以包含有多个纯虚函数,一个派生类中也可以包含多个虚函数
- 易错解释
- B. 错误。类模板的每个模板类型参数前都可以使用
class
或typename
关键字。
- B. 错误。类模板的每个模板类型参数前都可以使用
24. 以下程序的输出结果是( )。
- 答案:C
- 选项
- A. 6
- B. 12
- C. 8
- D. 7
- 易错解释
- A. 错误。
MAX(a, b)
返回4,乘以2得8。 - B. 错误。
MAX(a, b)
返回4,乘以2得8。 - D. 错误。
MAX(a, b)
返回4,乘以2得8。
- A. 错误。
25. 以下程序的输出结果是( )。
- 答案:B
- 选项
- A. 9 8 7 6
- B. 9 8 7
- C. 7
- D. 9 8 7 6 5
- 易错解释
- A. 错误。当
a
为5时,break
退出循环,不输出5。 - C. 错误。输出的是9、8、7。
- D. 错误。当
a
为5时,break
退出循环,不输出5。
- A. 错误。当
26. 以下说法中不正确的是( )。
- 答案:C
- 选项
- A. 定义派生类可用关键字class或struct
- B. 定义派生类时要指出派生类的类名和基类的类名
- C. 定义派生类时一定要给出继承方式,不能默认
- D. 定义派生类时,类体中给出派生类的成员
- 易错解释
- C. 错误。在定义派生类时,如果未指定继承方式,默认为私有继承(private)。
27. 以下程序的输出结果是( )。
答案:A
代码
选项
- A. 543345
- B. bhykpm
- C. bhy543kpm345
- D. bhy543
28. 以下说法中正确的是( )。
- 答案:B
- 选项
- A. 没有返回值的函数不能设置为内联函数
- B. 字符指针是指向字符串的指针,可以用字符串常量给字符指针赋值
- C. 外部类变量与外部静态类变量的作用域是相同的
- D. 定义一个数组没有对它进行初始化,则该数组的元素值都是无意义的
- 易错解释
- A. 错误。没有返回值的函数可以设置为内联函数。
- C. 错误。外部类变量和外部静态类变量的作用域不同。
- D. 错误。未初始化的数组元素值是未定义的,但不一定无意义。
29. 以下说法中不正确的是( )。
- 答案:C
- 选项
- A. 用来给数组进行初始化的初始值表内的数据项的个数必须小于等于数组元素个数
- B. C++程序中,通常使用const来定义符号常量,定义时必须指出类型
- C. 移位运算符在移位操作中,无论左移还是右移,对移出的空位一律补0
- D. 数组某维的大小可以用常量表达式,不可用变量名
- 易错解释
- C. 错误。右移运算符在移位操作中,对于有符号数,移出的空位补符号位;对于无符号数,移出的空位补0。
30. 以下程序的输出结果是( )。
答案:B
选项
- A. 9 8 7 6
- B. 9 8 7
- C. 7
- D. 9 8 7 6 5
31. 下列关于C++的说法中,正确的是( )。
- 答案:C
- 选项
- A. C++对于大小写不敏感
- B. C++属于解释性语言
- C. 任何合法的C语言程序都是合法的C++程序
- D. C++支持封装与继承,但是不支持多态
- 易错解释
- A. 错误。C++是大小写敏感的。
- B. 错误。C++是编译型语言。
- D. 错误。C++支持封装、继承和多态。
32. 下列哪项关键词属于C++所有但是C语言没有的()。
- 答案:B
- 选项
- A. extern
- B. virtual
- C. and
- D. goto
- 易错解释
- A.
extern
是C和C++都有的关键字。 - C.
and
是C++的别名,C语言中没有。 - D.
goto
是C和C++都有的关键字。
- A.
33. 有如下枚举类型的定义,下面说法错误的是哪一项( )。
答案:C
代码
1
enum fruit {hotdog, apple = 4, beef, orange};
选项
- A. fruit c = hotdog; 则c的值为0
- B. fruit c = apple; 则c的值为4
- C. fruit c = beef; 则c的值为2
- D. fruit c = orange; 则c的值为6
易错解释
- C. 错误。
beef
的值应该是5,因为apple
被显式赋值为4,beef
是下一个枚举值,所以是5。
- C. 错误。
34. 下面所述的四段代码,不能够完成遍历二叉树的是哪一项(打印二叉树所有节点仅一次)( )。
答案:B
代码
选项
A.
B.
C.
D.
1 2 3 4 5 6 7 8 9 10 11 12
void traversal(struct BiTree *node) { if (node == NULL) return; std::queue<BiTree*> q; q.push(node); while (!q.empty()) { auto front = q.front(); q.pop(); std::cout << front->data << std::endl; if (front->right) q.push(front->right); if (front->left) q.push(front->left); } }
易错解释
- B. 错误。这段代码中,
s.pop()
后再使用s.top()
会导致未定义行为。
- B. 错误。这段代码中,
35. 设计一个队列,以链表存储队列的元素。假设队首指针为head,队尾指针为tail,现指针p指向的元素即将入队,请写出正确的入队代码?()
- 答案:D
- 选项
- A. head = p, head = head->next;
- B. p->next = head->next, head = p;
- C. tail->next = p, tail = p;
- D. tail->next = p, p->next = NULL, tail = p;
36. 若是x为4,y为9,则(~x)^y的结果是( )。
- 答案:C
- 选项
- A. 1
- B. 10
- C. 13
- D. -14
- 易错解释
- C. 正确。
~4
的二进制表示为11111101
(假设8位),9
的二进制表示为00001001
,两者异或结果为11110100
,即十进制的13。
- C. 正确。
37. 下面关于C++函数的说法中,错误的选项是( )。
- 答案:A
- 选项
- A. 函数由函数名称、返回类型、参数、函数体组成,缺一不可
- B. 函数声明时参数类型不可省,参数名称不是必要的
- C. 有的函数可能没有return关键字
- D. C++可以在定义函数时,设置默认参数值
- 易错解释
- A. 错误。函数可以没有参数,也可以没有返回类型(如void函数)。
38. 定义了如下所示的test1类和它的子类test2,下列选项说法错误的是( )。
答案:C
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
class test1 { std::string name; public: std::string language; protected: float grade; }; class test2 : public test1 { public: char gender; void fun() { std::cout << gender << std::endl; std::cout << language << std::endl; std::cout << name << std::endl; std::cout << grade << std::endl; } };
选项
- A. fun()函数中变量gender可以正常输出
- B. fun()函数中变量language可以正常输出
- C. fun()函数中变量name可以正常输出
- D. fun()函数中变量grade可以正常输出
易错解释
- C. 错误。
name
是私有成员,无法在派生类中直接访问。
- C. 错误。
39. 下列C++程序实现了使用迭代器访问并输出数组vec的元素,空白处应该补充的代码是( )。
答案:A
代码
选项
- *A. std::cout « v « std::endl;
- B. std::cout « v « std::endl;
- C. std::cout « &v « std::endl;
- D. 其他选项均可以
易错解释
- A. 正确。
*v
解引用迭代器,获取元素值。
- A. 正确。
40. 关于下列几行C++代码,说法正确的是( )。
答案:B
代码
选项
- A. 直接输出c1 + c2的结果是195
- B. 直接输出c3 + c4 的结果是199
- C. 直接输出c1 + c3 的结果是196
- D. 其他选项说法均错误
易错解释
- B. 正确。
c3
和c4
的ASCII码分别为99和100,相加结果为199。
- B. 正确。
41. C++STL的核心不包括以下哪个选项( )。
- 答案:C
- 选项
- A. 迭代器
- B. 算法
- C. 指针
- D. 容器
- 易错解释
- C. 错误。指针不属于STL的核心部分。
42. 关于下列C++代码的时间复杂度与空间复杂度的说法,正确的是( )。
答案:A
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
struct node { int x, time; }; int solve(int N, std::vector<node>& A) { std::stack<node> s; int res = 0; for (int i = N - 1; i >= 0; i--) { int time = 0; while (!s.empty() && A[i].x > s.top().x) { time = std::max(s.top().time, time + 1); s.pop(); } s.push({A[i], time}); res = std::max(res, time); } return res; }
选项
- A. 时间复杂度为O(N),空间复杂度为O(N)
- B. 时间复杂度为O(2N),空间复杂度为O(N)
- C. 时间复杂度为O(N^2),空间复杂度为O(N/2)
- D. 时间复杂度为O(logN),空间复杂度为O(N/2)
易错解释
- A. 正确。每个元素最多入栈和出栈一次,时间复杂度为O(N)。
43. 下列关于C++常用标准库的一些说法,错误的是哪一项()。
- 答案:D
- 选项
- A. cout控制输出精度需要使用std::setprecision
- B. 标准错误流cerr属于标准输出流的一部分
- C. 字符串截取函数substr()属于std::string
- D. 一个C++工程里不可以有两个或多个命名空间
- 易错解释
- D. 错误。一个C++工程中可以有多个命名空间。
44. 假定输入的字符串中只包含字母和@号,请编写程序,将字符串中的前导@符全部移到字符串的尾部。例如:字符串中的内容为:@@@@ab@CD@G@@@,移动后,字符串中的内容为:ab@CD@G@@@@@@@。在编写程序时,不得使用C++语言提供的字符串函数。(输入的字符串不含空格,且字符串长度不大于1000)
45. 编写程序,从键盘上输入两个正整数,较大的数为m和较小的数为n,根据以下公式求P的值,并输出。(m和n为大于0且小于等于30的整数)
46. 定义了N×N的二维数组,数组元素(整数)通过键盘输入,请编写程序,求出数组周边元素的和值,并输出。(2<=N<=100)
仅供参考,可能有误