刷题-C/C++笔试小题

题目1

在这里插入图片描述
题解
正确答案:D
自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。
1.将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,如: float f = 100; 100 是 int 类型,会自动转换成 float,再赋值给 f。
2.在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。转换的规则如下:
a.转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。例如,int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算。
所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算。
char 和 short 参与运算时,必须先转换成 int 类型。

题目2

在这里插入图片描述
题解:

构造函数是一种特殊的函数,用来在对象实例化时初始化对象的成员变量。构造函数具有以下特点:
1)构造函数名必须与类的名字相同,并且不能有返回值(返回值也不能为void)。
2)每个类可以有多个构造函数。当开发人员没有提供构造函数的时候,编译器会提供一个没有
参数、默认的构造函数,但该构造函数不会执行任何代码。如果开发人员提供了构造函数,
那么编译器就不会再创建默认的构造函数了。
3)构造函数可以被重载,因此,一个类可以有多个构造函数。
4)构造函数的主要作用是完成对象的初始化工作。
5)构造函数不能被继承,但是构造函数能够被重载,可以使用不同的参数个数或参数类型来定义多个构造函数。
6)在类的继承关系中,当父类没有提供无参数的构造函数时,子类的构造函数中必须显式地调用父类的构造函数,
如果父类中提供了无参数的构造函数,此时子类的构造函数就可以不显式地调用父类的构造函数,
在这种情况下编译器会默认调用父类的无参数的构造函数。当有父类时,在实例化对象时会首先执行父类的构造函数,
然后才执行子类的构造函数。
在继承关系中,当定义派生类对象时,构造函数的执行顺序如下:
基类的构造函数→对象成员的构造函数→派生类的构造函数。
析构函数的执行顺序恰好和构造函数的执行顺序相反,
当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统会自动执行析构函数。
在定义派生类的对象时,先调用父类的构造函数,在调用成员的构造函数,最后调用派生类的构造函数。
可理解为“先父亲,再客人,最后自己”

题目3

在这里插入图片描述

选C
p是指向数组的指针,每个数组有三个int元素,
即p[0] 和 a[0][1], a[0][2],a[0][3] 表示一个空间
即p[1] 和 a[1][1], a[1][2],a[1][3] 表示一个空间
同时本题目问哪个选项能命中a数组中的元素
A是把索引2赋值给p,然后取内容,问题是系统地址为2并不一定是a数组的地址,因此不能选。
B是p当前地址+3,因为p=a,初始值指向a数组第一行第一列a[0][0],但是a数组不一定两行的地址是顺序排列的,因此p+2还能命中a[0][3],p+3就不一定指向什么位置了。
C是p[1]+1表示a[1][1]是在a数组内的,所以命中,即正确选项。
D是p[2],不能与a数组命中,p[0]和p[1]命中a数组的两行,p[3]就不知道指向什么位置了

题目4

在这里插入图片描述
题解
宏定义转换在程序运行之前,会先把所有宏定义换完之后才开始运行程序
#define ADD(x) xx main( ) { int a=4,b=6,c=7,d=ADD(a+b)c; printf(“d=%d”,d); ADD(a+b)c=xxc=4+64+6*7=70.就是简单的替换

题目5

在这里插入图片描述
题解
D.指针类型,32位就是4,64位就是8

题目6

在这里插入图片描述

《C++ Primer》第五版,P537 页:“当我面在派生类中覆盖某个虚函数时,可以再一次使用virtual关键字指出该函数的性质。然而这么做并非必须,因为一旦某个函数被声明为虚函数,则在所有派生类中它都是虚函数”

链接:https://www.nowcoder.com/questionTerminal/b32a8b2cdca440c5a2041b10bb92f88e
来源:牛客网

这题可以联想到重载,覆盖,隐藏的区别。
a.成员函数被重载的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual 关键字可有可无。

b.覆盖是指派生类函数覆盖基类函数,特征是:

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual 关键字。

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

题目6

在这里插入图片描述
题解:

首先,第一个for循环只循环了2次,所以3没有读入。其次,第一次ptr=a+0表示指向数组a的第一行第一个元素,即a[0][0],所以 a[0][0]=1,ptr++,ptr指向下一行(注意,不是下一个),但是由于第二次循环时 ptr=a+1,ptr被覆盖了,所以,ptr++并没有用,所以ptr是指向数组a的第二行,所以 a[1][0]=2。

题目7

在这里插入图片描述
题解:
在这里插入图片描述

本题是16位机器,char型占1个字节,int型占2个字节。
结构体中字节对齐有两条规则:
数据成员自对齐,即数据成员起始地址为数据类型长度的整数倍,如该题int型b只能从0,2,4…等地址处开始放;
结构体总长度是结构体中有效对齐值的整数倍,有效对齐值,如该题没明确指出,则为最长数据成员(int b)长度的整数倍;
根据上面两条规则,画出内存示意图。根据规则1,int b从2处开始放,此时结构体总长度为(1 + 1 + 2 + 1 = 5);再根据规则2,结构体总长度应为2的整数倍,故应为6.描红的两个字节表示被浪费的。

题目8

在这里插入图片描述
题解:
A错误,二维数组定义时不能使用变量定义维数;
C选项错误,二维数组定义时,可以省略第一维的定义,但不能省略第二维的定义。系统根据初始化的数据个数和第2维的长度可以确定第一维的长度;故选择D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值