计算机二级C++强化试题及答案_第1页
计算机二级C++强化试题及答案_第2页
计算机二级C++强化试题及答案_第3页
计算机二级C++强化试题及答案_第4页
计算机二级C++强化试题及答案_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机二级C++强化试题及答案1.若有定义语句`inta=10,*b=&a;`,则下列语句中行为错误的是()A.`*b=a;`B.`b=*&a;`C.`a=*b;`D.`b=&a;`答案:B解析:`b`是指针类型变量,存储合法的内存地址,`*&a`本质就是`a`,`a`是int类型值,将int值直接赋值给指针变量,类型不匹配,编译错误。A选项是将`a`的值写入`b`指向的内存单元(即变量`a`本身),行为合法;C选项取出`b`指向的值赋值给`a`,行为合法;D选项将`a`的地址重新赋值给`b`,行为合法。2.下列关于C++内联函数的描述中,正确的是()A.内联函数在运行时才将函数体替换到调用处B.内联函数可以提高程序的运行效率,但是会增加程序代码体积C.所有带循环结构的函数都不能声明为内联函数D.内联函数必须定义在类体内部答案:B解析:内联函数的替换过程发生在编译阶段,而非运行阶段,A错误;内联函数省去了函数调用的压栈、跳转、返回等开销,因此可以提升运行效率,但是每个调用点都会插入一份函数体副本,因此会增加程序的代码体积,B正确;带循环结构的函数只是编译器通常会忽略内联声明,不会强制报错,并非不能声明为内联函数,C错误;内联函数可以定义在类体外,只要添加`inline`关键字声明即可,D错误。3.有如下类定义:```cppclassA{public:intx;A(inta=0):x(a){}intgetX(){returnx;}~A(){cout<<'A';}};classB:publicA{public:~B(){cout<<'B';}};```执行语句`Bb;`,对象销毁后程序输出结果是()A.ABB.BAC.AD.B答案:B解析:构造函数调用顺序为:先基类构造,后派生类构造;析构函数调用顺序与构造顺序相反,即先派生类析构,后基类析构。本题中B类没有自定义构造函数,默认构造会自动调用基类A的构造,对象`b`生命周期结束后,先调用B类的析构输出字符`B`,再调用A类的析构输出字符`A`,最终输出结果为`BA`。4.下列运算符中,不能被重载的是()A.`&&`B.`[]`C.`.`D.`*`答案:C解析:C++标准规定,共有5个运算符不能被重载,分别是:成员访问运算符`.`、成员指针访问运算符`.*`、域运算符`::`、条件运算符`?:`、求类型长度运算符`sizeof`,因此本题选C。`*`作为乘法运算符或解引用运算符都可以被重载,符合规则。5.C++中定义抽象类的必要条件是()A.至少有一个纯虚函数B.至少有一个虚函数C.至少有一个公有成员D.不能定义自定义构造函数答案:A解析:抽象类的定义就是包含至少一个纯虚函数的类,抽象类不能实例化对象,只能作为基类被继承,抽象类需要定义构造函数,用于派生类构造过程中初始化基类部分,因此只有A选项符合要求。6.若已经声明了函数模板`template<typenameT>Tadd(Ta,Tb){returna+b;}`,则下列调用中错误的是()A.`add(1,2)`B.`add<>(1,2.0)`C.`add<int>(1,2.0)`D.`add<double>(1,2.0)`答案:B解析:函数模板调用时,如果没有显示指定模板参数,编译器会根据实参自动推导模板参数类型,要求所有推导位置的类型必须一致,否则推导失败。A选项两个实参都是int,推导T为int,调用正确;B选项第一个实参是int,第二个是double,推导T时得到两个不同类型,推导失败,编译错误;C选项显示指定T为int,第二个实参`2.0`会自动转换为int类型,调用正确;D选项显示指定T为double,第一个实参`1`自动转换为double,调用正确。7.有如下程序段:```cppinta[5]={1,2,3,4,5};int*p=a;*(p++)+=2;cout<<*p<<""<<a[0];```程序输出结果是()A.23B.31C.21D.32答案:A解析:单目运算符`*`和`++`优先级相同,结合性为右结合,因此`*(p++)`等价于`*(p++)`:先取`p`当前指向的值,再将`p`自增。本题中`p`初始指向`a[0]`,因此`*(p++)`就是`a[0]`,执行`*(p++)+=2`后,`a[0]`的值从1变为3,随后`p`自增指向`a[1]`,因此`*p`的值为2,最终输出结果为`23`。8.下列关于this指针的描述中,正确的是()A.this指针是指向类静态成员函数的指针B.每个对象调用非静态成员函数时都有一个专属的this指针C.this指针可以在静态成员函数中使用D.this指针指向的成员数据永远不能被修改答案:B解析:this指针是非静态成员函数中隐式存在的、指向当前调用对象的指针,A错误;静态成员函数不属于任何对象,不绑定对象实例,因此没有this指针,不能在静态成员函数中使用this,C错误;只有被const修饰的成员函数中,this才是指向const对象的指针,不能修改成员数据,普通非const成员函数中可以自由修改成员数据,D错误;每个对象调用非静态成员函数时,都会将自身地址传递给this指针,因此每个对象都有专属的this指针,B正确。9.关于公有继承,下列描述错误的是()A.基类的公有成员在派生类中仍然是公有成员B.基类的保护成员在派生类中仍然是保护成员C.基类的私有成员在派生类中仍然是私有成员,可以直接访问D.派生类对象可以直接访问基类的公有成员答案:C解析:无论采用哪种继承方式,基类的私有成员都不能被派生类直接访问,仅在派生类中存在,没有访问权限,因此C错误,其余选项均符合公有继承的访问权限规则。10.下列关于C++引用的描述,错误的是()A.引用必须在定义的时候初始化B.一旦引用初始化后,就不能再引用其他变量C.可以声明空引用D.引用可以作为函数的参数和返回值答案:C解析:引用必须绑定到一个已经存在的合法对象,不能声明空引用,也不能引用未分配空间的对象,因此C错误,其余选项均为引用的正确特性。11.下列关于C++异常处理的描述中,正确的是()A.try块必须对应至少一个catch块B.throw语句不能抛出自定义类型的异常C.`catch(...)`可以捕获所有类型未被前面catch块捕获的异常D.异常处理完成后程序会回到throw的位置继续执行答案:C解析:一个try块可以没有catch块,捕获到的异常可以抛给上层调用栈的处理逻辑,A错误;throw可以抛出任意类型的异常,包括自定义类类型,B错误;`catch(...)`是C++提供的捕获所有异常的语法,会捕获所有未被前面catch块匹配的异常,C正确;异常抛出后,程序会跳过try块中throw之后的所有代码,直接匹配catch块,处理完成后从整个try-catch结构之后继续执行,不会回到throw位置,D错误。12.编译器生成的类默认拷贝构造函数的行为是()A.不进行任何拷贝操作B.只拷贝对象的地址,不拷贝内容C.对对象的每个非静态成员执行逐成员值拷贝D.只拷贝对象的公有成员答案:C解析:如果用户没有自定义拷贝构造函数,编译器会自动生成默认拷贝构造函数,默认行为是对对象的所有非静态成员执行逐成员值拷贝(也叫浅拷贝),当类中没有堆内存指针成员时,默认拷贝构造可以正常工作,当存在堆内存指针成员时,浅拷贝会导致两个对象的指针指向同一块堆内存,引发doublefree错误,需要用户自定义深拷贝构造函数,因此C正确。13.下列关于友元的描述中,错误的是()A.友元函数可以访问类的所有私有成员和保护成员B.友元关系是单向的,不可传递C.一个类的成员函数可以作为另一个类的友元D.友元函数必须定义在类的内部答案:D解析:友元函数只需要在类内部声明友元关系即可,定义可以在类外部,友元函数不是类的成员函数,不需要类域限定,因此D错误,其余选项均符合友元的规则。14.已知`inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};`,则`a[1]+2`表示()A.元素`a[1][2]`的地址B.元素`a[1][2]`的值C.元素`a[2][2]`的地址D.第一行首元素的地址答案:A解析:二维数组中,`a[i]`表示第i行的首地址,类型为指向int的指针,进行指针算术运算时,`a[i]+n`表示第i行第n个元素的地址,即`&a[i][n]`,本题中`i=1,n=2`,因此`a[1]+2`就是`&a[1][2]`,即元素`a[1][2]`的地址,A正确。15.关于虚函数和纯虚函数,下列描述正确的是()A.纯虚函数没有函数体B.虚函数不能是静态成员函数C.虚函数重写的时候必须和基类原型完全一致,不能有任何不同D.构造函数可以是虚函数答案:B解析:纯虚函数可以定义函数体,仅需要在声明时添加`=0`标记即可,函数体可以定义在类外,A错误;虚函数需要绑定对象实现运行时多态,静态成员函数不绑定任何对象,因此虚函数不能是静态成员函数,B正确;C++允许协变,重写虚函数时,返回值类型可以是基类指针/引用,改为派生类指针/引用,不需要完全一致,C错误;构造函数执行时对象的虚函数表还未完成初始化,因此构造函数不能是虚函数,析构函数可以定义为虚函数,D错误。程序填空题题目:函数`fun`的功能是将一个十进制整数转换为2~16进制的字符串,转换规则为除基取余、逆序输出,10~15对应字符A~F,请补全代码中的空缺。```cppusingnamespacestd;stringfun(intn,intk){stringres;charnum[]="0123456789ABCDEF";if(n<0){res+='-';n=-n;}while(n!=0){res+=num[____1____];n=____2____;}____3____;returnres;}intmain(){intn,k;cin>>n>>k;cout<<fun(n,k)<<endl;return0;}```答案:空1:`n%k`解析:每次取n除以基数k的余数,对应转换后当前位的字符,`n%k`的结果正好是0~15,对应`num`数组的下标。空2:`n/k`解析:将n除以k的商作为下一次循环的被除数,继续计算更高位。空3:`reverse(res.begin(),res.end())`解析:转换过程中得到的余数是从低位到高位排列,因此需要反转字符串得到正确的顺序,`reverse`函数来自`<algorithm>`头文件,符合调用要求。测试:输入`102`输出`1010`,输入`25516`输出`FF`,结果正确。程序改错题题目:函数`gcd`的功能是用辗转相除法求两个正整数的最大公约数,程序中有两处错误,请找出并修正,不得增删行。```cppusingnamespacestd;intgcd(inta,intb){while(a!=0){intr=a%b;a=b;b=b;}returna;}intmain(){intx,y;cin>>x>>y;cout<<gcd(x,y)<<endl;return0;}```答案:错误1:`while(a!=0)`改为`while(b!=0)`解析:辗转相除法的循环终止条件是除数为0,此时被除数就是最大公约数,因此循环条件应为`b!=0`。错误2:`b=b`改为`b=r`解析:每次计算得到余数`r`后,需要将原除数`b`作为新的被除数,余数`r`作为新的除数,因此此处应给`b`赋值为`r`。测试:输入`2418`输出`6`,输入`105`输出`5`,结果正确。编程题题目:请编写符合要求的C++程序:定义基类`Shape`,包含虚函数`getArea()`和`getPerimeter()`,返回值都为0;从`Shape`公有派生矩形类`Rectangle`和圆类`Circle`,`Rectangle`包含私有成员长和宽,`Circle`包含私有成员半径,两个派生类分别重写`getArea`和`getPerimeter`实现对应形状的面积和周长计算;`main`函数中创建长为3宽为4的矩形对象、半径为2的圆形对象,通过基类指针分别调用两个对象的`getArea`和`getPerimeter`并输出结果,π取3.14。参考实现代码:```cppusingnamespacestd;constdoublePI=3.14;classShape{public:virtualdoublegetArea(){return0;}virtualdoublegetPerimeter(){return0;}virtual~Shape(){}//虚析构,避免派生类对象内存泄漏};classRectangle:publicShape{private:doublelength;doublewidth;public:Rectangle(doublel,doublew):length(l),width(w){}doublegetArea()override{returnlength*width;}doublegetPerimeter()override{return2*(length+width);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论