C++期末、笔试易错题整理含答案,解析(一)

错题1

若有以下说明,则在类外使用对象objX成员的正确语句是()。

class X
{
    int a;
    void fun1();
public:
    void fun2();
};
X objX;
A. objX.a=0;
B.objX.fun1();
C.objX.fun2();
D.X::fun1();

答案 C

解析:C++中class默认成员为private,struct默认为public。

错题2

以下程序段执行后结果是()

#include<stdio.h>
int` `main(){
  ``short` `*p,*q;
  ``short` `arr[15] = {0};
  ``p = q = arr;
  ``p++;
  ``printf``(``"%d,"``, p - q);
  ``printf``(``"%d,"``, (``char``*)p - (``char``*)q);
  ``printf``(``"%d"``, ``sizeof``(arr) / ``sizeof``(*arr));
}

答案 1,2,15

错题3

有如下语句序列:

char str[10];
cin>>str;

当从键盘输入 “I love this game” 时,str 中的字符串是()

答案 I

解析:cin输入时遇到空格自动结束输入。

错题4

下列运算符,在C++语言中不能重载的是()

解析:并不是所有的操作符都能被重载。除了 . , .* , :: , ? : , sizeof , typeid 这几个运算符不能被重载,其他运算符都能被重载。

.表示成员选择

.*表示指向成员操作的指针

?=表示条件操作 expr?expr:expr

2022.11.28

错题5

对于如下C++程序,请问输出结果是()

int main() {
	int a = 1, b = 3, c = 2;
	while (a < b < c)
	{
		++a;
		--b;
		--c;
	}
	cout << a << " " << b << " " << c << "\n";
	return 0;
}

答案 3 1 0

解析:a<b<c运算可以看为(a<b)<c的运算,而a<b结果为bool值,只有0,1两种选项。

错题6

一 重载(overload)

基本条件:
  • ​ 函数名必须相同;
  • ​ 函数参数必须不相同,可以是参数类型或者参数个数不同;
  • ​ 函数返回值可以相同,也可以不相同;

二 重写(override)

基本条件:
  • ​ 重写的函数和被重写的函数必须为virtual函数,分别位于基类和派生类中;

  • ​ 重写的函数和被重写的函数函数名和函数参数必须一致;

  • ​ 重写的函数和被重写的函数返回值相同,或者都返回指针或引用,并且派生类虚函数所返回的指针或引用的类型是基类中被替换

    ​ 的虚函数所返回的

  • ​ 指针或引用的类型的子类型。

三 隐藏

基本条件:
  • ​ 子类和父类的函数名称相同,但参数不同,此时不管父类函数是不是virtual函数,都将被隐藏。
  • ​ 子类和父类的函数名称相同,参数也相同,但是父类函数不是virtual函数,父类的函数将被隐藏。

2022.11.29

错题7

int a=5,则 ++(a++)的值是?

答案 编译出错

解析:++运算只能针对变量运算,括号内a++返回的是一个具体值,具体值进行左加加运算编译失败。如++5编译器会报错。

错题8

new和malloc的区别

1.new从自由存储区上分配内存,malloc从堆上分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配。那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。
2.new、delete 返回的是某种数据类型指针;malloc、free 返回的是 void 指针。
3.使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算;使用malloc则需要显式地指出所需内存的尺寸。
4.new 可以调用对象的构造函数,对应的 delete 调用相应的析构函数;malloc 仅仅分配内存,free 仅仅回收内存,并不执行构造和析构函数。在new一个对象的时候,首先会调用malloc为对象分配内存空间,然后调用对象的构造函数。delete会调用对象的析构函数,然后调用free回收内存。
5.new、delete 是操作符,可以重载;malloc、free 是函数,可以重写(覆盖)。

错题9

阅读如下程序,该程序的执行结果为?

#include "stdio.h"
class A
{
public:
    virtual void Test()
    {
        printf("A test\n");
    }
};
class B: public A
{
public:
    void func()
    {
        Test();
    }
    virtual void Test()
    {
        printf("B test\n");
    }
};
class C: public B
{
public:
    virtual void Test()
    {
        printf("C test\n");
    }
};
int main()
{
    C c;
    ((B *)(&c))->func();
    ((B)c).func();
}

答案

​ C test

​ B test

解析: (B *)(&c)是将对象c的地址转为B类型的指针,但是其仍然指向c的首地址,此时调用func()函数,因为在类B的func()中调用Test()函数没有this指针,所以此时调用的为c中的func()函数,输出C test,下面为类B创建对象名为c,调用B中的Test()。

错题10

深拷贝和浅拷贝的区别:浅拷贝主要是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝需要不但对指针进行拷贝,并对指针指向的内容进行拷贝,经过深拷贝后的指针是指向两个不同地址的指针。

2022.11.30

错题11

1.重载是用来描述同名函数具有相同或者相似功能,但是参数个数或者类型顺序不一样的函数管理操作

返回值不能作为重载的条件

2.重写是子类对父类同名函数的重新定义

二者区别:

1.作用域不同:重载是在同一区域,子类无法重载父类,父类同名函数的将被覆盖,重写是在父类与子类之间

2.重载是在编译期间根据参数列表决定,重写是在运行期间根据具体对象类型决定调用函数

多态条件:

1.要有继承

2.要有virtual虚函数重写

3.要用父类指针指向子类指针

错题12

以下关于STL各种容器和算法的sort和find函数对重载运算符的描述正确的是()

A.二叉树类型的容器的sort和find都会调用operator <
B.线性类型容器sort会调用operator <
C.二叉树类型的容器的find会调用operator ==
D.线性类型容器使用std::find会调用operator ==

答案 C

解析:二叉树中没有相等的值。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想广东收租

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值