101-110

注:以下问题的部分解析并非全部是自己原创,只是为了便于以后复习,直接粘贴总结的答案,主要来源是七月在线中的解析部分。https://www.julyedu.com/question/selectAnalyze/kp_id/4/cate/C

1、 在C++语言中,若要对Data类中重载的加法运算符成员函数进行声明,下列选项中正确的是( )

A Data+operator(Data);
B Data+(Data);
C Data operator+(Data);
D Data operator+(Data,Data);

解释:选C

运算符重载声明形式为:返回类型 operator运算符(参数表);由于加法是二目运算符,作为类成员函数,默认已经有一个参数this指针,还需要一个数据做“被加数”,因此参数列表中Data的数目是1个。此外,使用友元函数也能够达到同样的目的,其声明为friend Data operator+(Data,Data),因为友元函数不是类的成员函数,没有this指针,其形参数目与运算符需要的数目相同。

2、 以下涉及到内存管理的代码段中,有错误的是( )

A int *a = new int(12);
//…
free(a);
B int *ip = static_cast(malloc( sizeof(int)));
*ip = 10;
//…
delete ip;
C double *a = new double[1];
//…
delete a;
D int *ip = new int(12);
for(int i=0;i<12; ++i)
{
ip[i] = i;
}
delete []ip;

解释:选D

malloc函数用于申请一块内存空间,申请成功是返回类型为void* 的内存地址,反之返回NULL,而free用来释放malloc申请的内存空间。
new关键字创建对象时,首先申请了一块内存空间(默认调用malloc),然后调用构造函数,最后返回正确的指针,而delete则执行反向过程,即先调用析构函数,然后释放申请空间(默认调用free)。
选项A,a为简单类型,使用new时无需调用构造函数,故在释放空间时也无需调用析构函数,故使用free虽不至出错,但强烈不推荐。
选项B,delete会先调用析构函数然后释放内存空间,而简单类型不存在构造函数,故delete直接释放了由malloc申请的内存空间。与A选项相同,B选项也是new-delete和malloc-free混用的情况,强烈不推荐。
选项C,使用new[]创建的a为简单类型,使用delete和delete[]释放该空间效果相同,而对于对象数组,delete[]会为对数组中每个对象调用析构函数,而delete则不会。要说明的是,因为double是基本数据类型,所有new[]和delete可以混用,但正常情况应该是new[]和delete[]搭配。
选项D,int* ip = new int(12)实际上只申请了一个int长度的内存,并且初始化为12;后面的for循环显然越界了,故在执行delete[]时会发生错误。

3、 请选择下面代码的输出结果( )

int main(int argc, char* argv[])
{
int a = 10;
int b = 4;
int c = a/b;
int d = c * a * b++;

std::cout << d << std::endl;
return 0;

}
A 60
B 80
C 100
D 125

解释:选B

程序首先将a和b分别赋值为10和4,由于整数除法得到是舍去小数部分的整数,故c = a/b = 2,然后先计算d = cab = 2104 = 80,再执行b自增操作,即表达式执行完后b值为5。题目的输出是d的值,故运行程序后得到80。

4、Win32系统里,下面几个sizeof的运行结果是( )

int intValue = 1024;
char str[] = “Tencent” ;
const char* ch = str;
sizeof(intValue) = _a;
sizeof(str) = b;
sizeof(ch) = c;
A a=1, b=1, c=1
B a=4, b=4, c=4
C a=4, b=7, c=4
D a=4, b=8, c=4

解释:选D

32位系统中,int型变量和char*型指针的大小都是4个字节,故a = 4,c = 4。在定义str时,”Tencent”需要7个字符的空间,并且字符串结尾要加上’\0’以示字符串的结束,即str一共占8个字符的大小,故b = 8。

5、 以下是C++的不同数据类型值的比较语句,请问这些判断语句中作为条件部分的语句编写有问题的有( )

A 如果变量bVar为布尔类型:if (false = = bVar) { doSomeThing(); }
B 如果变量nVar为int型:if (0 = = nVar) { doSomeThing(); }
C 如果变量fVar为float型:if ( 0.02= = fVar) { doSomeThing(); }
D 如果变量sVar为字符串型:if ( “” = = sVar) { doSomeThing(); }

解释:选D

0.02无法用二进制精确表示。题中fVar为float类型,而0.02作为字面值,默认为double类型,由于二者精度不同,对0.02的接近程度也不同,故该判断条件永远不会为真。若将fVar改为double型就没有问题了。

6、 C语言里i=5,j=7,请问i|j等于多少( )

A 1
B 3
C 5
D 7

解释:选D

使用2进制可将5表示为0101,将7表示为0111,|为按位或运算,故i|j = 0101|0111 = 0111 = 7。

7、 请阅读如下C++代码:

struct A
{
void foo(){printf ( “foo” );}
virtual void bar(){printf ( “bar” );}
A(){bar();}
};
struct B : A
{
void foo() {printf ( “b_foo” );}
void bar() {printf ( “b_bar” );}
};
如果执行如下语句:
A * p = new B;
p-> foo();
p-> bar();
那么其输出是( )
A b_bar foo b_bar
B bar foo b_bar
C b_bar foo bar
D b_bar b_foo b_bar
E bar b_foo bar

解释:选B

B继承自A,当new B时会依次调用A、B的无参构造函数,而A的无参构造函数中又调用成员函数bar(),此刻由于尚未构造继承对象,所以bar()只会调用A的bar,从而最先输出bar。执行p->foo()时,由于foo()不是虚函数,所以其调用由p指针类型决定,调用的是A的成员函数foo(),输出foo;执行p-> bar()时,由于bar()是虚函数,且子类中有重写,所以会调用B::bar(),输出b_bar,故答案选B。
若将B中也添加一个构造函数。
struct B : A
{
void foo() {cout << “b_foo” ;}
void bar() {cout << “b_bar” ;}
B(){bar();}
};
则有:
bar b_bar foo b_bar

8、 有一个如下的结构体:

struct A
{
long a1;
short a2;
int a3;
int *a4;
}
请问在64位linux系统下用sizeof(struct A)计算出的大小是多少( )
A 24
B 28
C 16
D 18

解释:选A

首先在64位linux系统中虚拟内存寻址空间是64位,即需要64位才可以容纳一个虚拟内存地址,所以该系统中int* 占8位。其次在64位系统中,long占8位,int依然占4位,short占2位,但是默认的对齐系数为8字节。所以在不考虑内存对齐的情况下,sizeof(struct A)=8+2+4+8=22;考虑内存对齐时,需要进行如下两步计算,
1)字节对齐
a1:long型,长度8=8 按8对齐;起始offset=0 0%4=0;存放区域[0,7]
a2:short型,长度2<8 按2对齐;起始offset=8 8%2=0;存放区域[8,9]
a3:int型,长度4<8 按4对齐;起始offset=10 10%4=2;添加2节字保证对齐,存放区域[12,15]
a4 :int* 型,长度8=8 按8对齐;起始offset=16 16%8=0;存放区域[16,23]
成员大小=24
2)整体对齐
整体对齐系数=min(max(long,short,int, int*),8)(其中的8表示对齐系数)
综上,整体大小为成员大小按整体对齐系数圆整,而24%8=0无需补充字节,所以sizeof(struct A)=24。

9、 派生类对象对其基类中的什么成员是可访问的( )

A 公有继承的公有成员
B 私有继承的公有成员
C 私有继承的保护成员
D 保护继承的保护成员

解释:选A

基类成员在派生类的访问属性取决于继承方式以及这些成员在基类中的访问属性。
(1)基类的私有成员无论何种继承方式在派生类中均不可直接访问。
(2)在公有继承方式下,基类的保护和公有成员在派生类中均保持原访问属性。
(3)在保护继承方式下,基类的保护和公有成员在派生类中的访问属性均为保护属性。
(4)在私有继承方式下,基类的保护和公有成员在派生类中的访问属性均为私有属性。

10、开发c代码时,经常见到如下类型的机构体定义:

typedef struct list_t
{
struct list_t *next;
struct list_t *prev;
char data[0];
}list_t;
最后一行char data[0];的作用是( )
A 方便管理内存缓冲区
B 减少内存碎片化
C 标识结构体结束
D 没有作用

解释:选A

在结构中,data是一个数组名,但该数组没有元素。如果给这个结构体分配的内存大于这个结构体实际大小,后面多余的部分就是这个data的内容,这种声明方法可以实现C语言里的数组扩展。值得一提的是,该技术实际上使用了数组下标溢出,属于有风险的略显过时的技术,现代编译器往往给出warning甚至error,实践中应避免使用。
sizeof(list_t) == 8
char data[3] = “ab”;
struct list_t *p = (struct list_t *)malloc(sizeof(struct list_t )+strlen(data))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值