51-60

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

1、C++中关于堆和栈的说法,哪个是错误的( )

A、在堆上频繁的调用new/delete容易产生内存碎片,栈没有这个问题
B、堆的大小仅受操作系统的限制,栈的大小一般较小
C、堆和栈都可以动态分配
D、堆和栈都可以静态分配

解释:选D

为程序分配的内存可以分为栈区、堆区、静态区一级程序代码区,其中
栈区: 是由系统自动分配的,例如函数声明中的局部变量、参数等。栈区的数据保持“先进后出”的性质,分配和销毁不会产生内存碎片。
堆区:是动态存储结构,需要显式声明申请(new,malloc),也需要显式释放空间,否则容易产生内存泄露,是不能静态分配的,在堆上频繁的调用new/delete容易产生内存碎片。
(如果持续递归调用不退出,会发生栈溢出错误。)

2、关于引用的说法,哪个是错误的( )

A、引用变量必须初始化才可以使用
B、类对象作为函数参数时引用比传值效率更高些
C、可以返回函数内的栈变量的引用
D、引用类型的类成员,构造函数中必须用初始化列表初始化,而不能使用赋值初始化

解释:选C

引用相当于是为变量创建了一个别名,是不占用内存空间的。
引用变量必须初始化(否则无法确定被替换对象)。
在类变量做函数参数时,如果是值传递,会调用拷贝构造函数(或重载的等号运算符)重新生成一份数据,而如果使用引用类型,则避免了拷贝数据,效率比值传递高。
如果是类的数据成员是引用类型,必须在任何成员函数被调用前被初始化,故只能在初始化列表中即完成初始化。
函数体内的栈变量,在函数返回后即被编译器回收,因此无法返回引用类型的栈变量。

3、下列关于构造函数的描述中,错误的是( )

A、构造函数可以设置默认的参数
B、构造函数在定义类对象的自动执行
C、构造函数可以是内联函数
D、构造函数不可以重载

解释:选D
4、阅读以下C++代码

class A;
class B;
void F()
{
A a;
B b;
}
在函数F中,本地变量a和b的构造函数(constructor)和析构函数(destructor)的调用顺序是( )
A、b构造 a构造 a析构 b析构
B、a构造 a析构 b构造 b析构
C、b构造 a构造 b析构 a析构
D、a构造 b构造 b析构 a析构

解释:选D

a首先定义,b随后定义,因此,a、b依次调用构造函数;由于a、b是在栈上有编译器自动申请空间,因此,析构时服从后进先出的原则,b先析构,然后a再析构。

5、关于C++中继承的说法,哪个是错误的( )

A、只能公有继承、不能私有继承
B、基类中至少有一个虚函数才能支持运行时多态
C、派生类可以访问基类中的protected类型的成员
D、一个基类可以有多个派生类,一个派生类可以有多个基类

解释:选A
6、下列C语言的代码中,变量t的最终结果是多少( )

int t=125;
t = t&27;
t = t^31;
A、 6
B、2013
C、7
D、26

解释:选A
7、调用一成员函数时, 使用动态联编的情况是( )

A、通过对象调用一虚函数
B、通过指针或引用调用一虚函数
C、通过对象调用静态函数
D、通过指针或应用调用一静态函数

解释:选B

联编是指一个计算机程序自身彼此关联(使一个源程序经过编译、连接,成为一个可执行程序)的过程,在这个联编过程中,需要确定程序中的操作调用(函数调用)与执行该操作(函数)的代码段之间的映射关系,按照联编所进行的阶段不同,可分为静态联编和动态联编。
静态联编是指联编工作在编译阶段完成,又称为早绑定。
动态联编是指联编在程序运行时动态地进行,根据当时的情况来确定调用哪个同名函数,这种联编又称为晚绑定。
动态联编只能通过指针或引用标识对象来操作虚函数;如果采用一般的标识对象来操作虚函数,将采用静态联编的方式调用虚函数。

8、给出以下定义, 则正确的叙述为( )

char x[ ] = “abcdefg”;
char y[ ] = {‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’};
A、数组X和数组Y等价
B、数组X和数组Y长度相同
C、数组X的长度大于数组Y的长度
D、数组X的长度小于数组Y的长度

解释:选C
9、现在有以下两个函数,调用test的结果是( )

char* getMem(void)
{
char* p = “hello world”;
p[5] = 0x0;
return p;
}
void test (void)
{
char* s = 0x0;
s = getMem( );
printf("%s",s);
}
A、hello
B、无输出
C、Hello world
D、不确定

解释:选B

test函数中的p指针首先指向了字符串。当指针指向常量字符串时,它的内容是不可以被修改的。所以p的内容是不能更改的p[5] = 0x0,此时程序会出错,所以无输出。
若将p[5] = 0x0;这一句删除将输出hello world
0x0 表示null

10、阅读下面代码,程序会打印出来的值是( )

#include
void f(char **p)
{
*p += 2;
}
void main( )
{
char *a[ ] = {“123”,“abc”,“456”},**p;
p = a;
f( p );
printf("%c\r\n",**p);
}
A、123
B、abc
C、456
D、3

解释:选D

在这里插入图片描述
char * a[]定义了一个指针数组,每个元素是一个指向字符型数据的指针,即a[0]中存放的是第一个元素"123"首字符的地址,即’1’的地址;a[1]存放的是第二个元素"abc"首字符的地址,即’a’的地址,以此类推。
char ** p定义了一个指向字符型指针的指针。p=a表示将a数组第一个元素的地址赋值给p,即a[0]的地址。
调用f ( p )后,执行* p += 2,* p 取出的是p所指地址的内容,即a[0]的内容,也就是字符’1’的地址,* p+=2就是将指针向右移动2步,此时* p指向字符’3’的地址。所以**p应该输出字符’3’。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值