第一题
1. 下面代码中sizeof(A)结果为()
#pragma pack(2) class A { int i; union U { char str[13]; int i; }u; void func() {}; typedef char* cp; enum { red, green, blue }color; };
A:20
B:21
C:22
D:24
答案及解析 C
本题考查的是如何计算类所占空间大小,union(联合体)和enum(枚举类型)的空间计算;
首先我们来梳理一下:
1. 只算成员变量的大小,不算成员函数;
2. typedef只是对类型重定义,没有开空间,也不用算;
3. 需要算的有
int i;
union;
enum;
第一步:算int i;我们首先要看对齐数是多少
上面的#pragma pack(2)是把默认对齐数设定为2
对齐数 = 默认对齐数和成员本身大小的较小值
所以int i的对齐数为2,但是每个都是从偏移量0的位置开始,然后占据自身大小的字节;
第二步:计算union的大小;
算union的大小,有两个原则
1. union联合体的大小至少是最大成员的大小
2. 联合体的大小不是最大对齐数的整数倍的时候,要扩大到最大对齐数的整数倍;
所以union中的char数组的对齐数为1,int的对齐数为2;
最后union所占空间为14
第三步:计算enum枚举类型的大小,记住枚举类型大小就是4字节,所以跟默认对齐数比较之后,对齐数为2;
第二题
2. 使用重载函数编程序的目的是()
A:使用相同的函数名调用功能相似的函数
B:共享程序代码
C:提高程序的运行速度
D:节省存储空间
答案及解析 A
A:正确:重载函数写出来的目的就是为了完成不同类型却相同的功能;比如你要实现个加法函数,肯定会有很多类型,我们就需要函数重载;
B:错误:不可以共享代码
C:错误:都是调用函数,说白了代码都一样,不会提高速度
D:错误:不会节省空间
第三题
3. 下列运算符重载函数中,属于友元函数的是()
A:Base operator+(Base);
B:Base operator--(Base);
C:Base operator&&(Base, Base);
D:Base operator++(Base,int);
答案及解析 BCD
在正常的成员函数中,会有一个隐藏的this指针,作为成员函数的第一个参数,但是有的时候,我们是不需要this指针作为函数的参数的;这个时候友元函数就出现了;
A:+运算符,是需要两个操作数的,A选项显式地给了一个Base对象,然后有一个隐藏的this指针;满足+运算符的语法要求;
B:前置--运算符,只需要一个操作数,所以B的函数必须是友元函数才能实现;
C:&&运算符,需要两个操作数,B选项中显式地传了两个参数作为操作数,所以也不需要this指针了;
D:后置++运算符,需要一个操作数,后置++在函数参数这里是有个int来区分的,带int的就是后置,不带的就是前置;所以这里显式传了一个参数作为操作数,不需要this,就为友元;
第四题
4. 下面关于C++缺省参数描述错误的是( ) 【多选】
A.缺省参数是声明或定义函数时为函数的参数指定一个默认值.
B.在调用有缺省参数的函数时,如果没有指定实参则采用该默认值,否则使用指定的实参
C.C和C++都支持缺省参数
D.全缺省就是参数全部给缺省值,半缺省就是缺省一半的值
答案及解析 C D
A:正确,缺省参数就是在声明或者定义的时候给函数参数一个缺省值;
B:正确,缺省参数就是为了我们没有给指定的实参时,给形参提供缺省值;
C:错误,C不支持,缺省参数是C++的;
D:错误,全缺省是所有参数都有缺省值,半缺省是有参数有缺省值,有的没有
第五题
5. 以下不是double compare(int,int)的重载函数的是( )
A.int compare(double,double)
B.double compare(double,double)
C.double compare(double,int)
D.int compare(int,int)
答案及解析 D
重载函数:参数的类型不同,参数个数不同,跟返回值无关;
A、B、C为重载函数
D不是,因为参数类型相同,个数相同;