版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
9月计算机二级《C++》机考题库与答案一、选择题1.下列关于类和对象的叙述中,错误的是()。A.一个类只能有一个对象B.对象是类的具体实例C.类是对某一类对象的抽象D.类和对象的关系是一种数据类型与变量的关系答案:A。一个类可以创建多个对象,对象是类的具体实例,类是对具有相同属性和行为的一类对象的抽象,类和对象的关系类似于数据类型和变量的关系。2.有如下定义:```cppclassMyClass{public:MyClass(inta){data=a;}private:intdata;};```若要为MyClass类重载流插入运算符“<<”,使得程序中可以“cout<<obj;”形式输出MyClass类的对象obj中的数据成员data,则横线处的声明语句应为()。A.friendostream&operator<<(ostream&os,constMyClass&obj);B.friendostream&operator<<(ostream&os,MyClass&obj);C.ostream&operator<<(ostream&os,constMyClass&obj);D.ostream&operator<<(ostream&os,MyClass&obj);答案:A。流插入运算符“<<”一般定义为类的友元函数,并且参数中的对象通常为常引用,以避免不必要的对象拷贝,返回值类型为ostream&,用于支持连续输出。3.下列关于虚函数的描述中,正确的是()。A.虚函数是一个static类型的成员函数B.虚函数是一个非成员函数C.基类中说明了虚函数后,派生类中对应的函数可不必说明为虚函数D.派生类的虚函数与基类的虚函数具有不同的参数个数和类型答案:C。虚函数是非static的成员函数,它是类的成员函数。在基类中声明为虚函数的函数,在派生类中即使不使用virtual关键字声明,只要函数名、参数个数和类型、返回值类型都相同,它也是虚函数。派生类的虚函数与基类的虚函数必须具有相同的参数个数和类型。4.有如下程序:```cppinclude<iostream>usingnamespacestd;classBase{public:Base(){cout<<'B';}~Base(){cout<<'b';}};classDerived:publicBase{public:Derived(){cout<<'D';}~Derived(){cout<<'d';}};intmain(){Derivedobj;return0;}```执行这个程序的输出结果是()。A.BDdbB.BDbdC.DBbdD.DBdb答案:A。在创建派生类对象时,先调用基类的构造函数,输出'B',然后调用派生类的构造函数,输出'D'。在程序结束时,先调用派生类的析构函数,输出'd',再调用基类的析构函数,输出'b'。5.下列关于模板的叙述中,错误的是()。A.模板声明中的第一个符号总是templateB.类模板不能有数据成员C.类模板的成员函数都是模板函数D.函数模板是一个函数族答案:B。类模板可以有数据成员。模板声明总是以template开头。类模板的成员函数都是模板函数,函数模板是一组具有相同函数名、不同参数类型的函数的集合,即一个函数族。6.有如下函数模板定义:```cpptemplate<typenameT>Tfunc(Ta,Tb){returnab;}```若要求以int型数据7和8作为函数实参调用该模板函数,不能正确调用的是()。A.func<int>(7,8);B.func<>(7,8);C.func(7,8);D.func<int,int>(7,8);答案:D。函数模板调用时,当可以从实参自动推导出模板参数类型时,可以省略模板参数列表,如C选项;也可以显式指定模板参数类型,如A选项;还可以在模板参数列表为空时,编译器从实参推导类型,如B选项。D选项中指定了两个相同的模板参数类型,是错误的调用方式。7.下列关于C++流的叙述中,错误的是()。A.cout是一个预定义的输出流对象B.可以用ifstream定义一个文件输入流对象C.执行语句序列chary="PQMN";cout<<y;将输出字符串“PQMN”的地址D.执行语句序列charx[80];cin.getline(x,80);时,若键入“Happynewyear”,则x中的字符串是“Happynewyear”答案:C。执行语句序列chary="PQMN";cout<<y;时,会输出字符串“PQMN”,而不是字符串的地址。cout是预定义的标准输出流对象,ifstream用于定义文件输入流对象。cin.getline(x,80);会读取一行字符串到字符数组x中。8.有如下程序:```cppinclude<iostream>include<fstream>usingnamespacestd;intmain(){ofstreamoutf("test.dat");if(!outf){cerr<<"openerror"<<endl;return1;}outf<<"Hello,world!";outf.close();ifstreaminf("test.dat");charbuffer[80];inf.getline(buffer,80);cout<<buffer<<endl;inf.close();return0;}```这个程序的功能是()。A.从屏幕输入一个字符串存入文件test.datB.从键盘输入一个字符串显示在屏幕上C.将字符串“Hello,world!”存入文件test.dat,并将该文件内容显示在屏幕上D.将字符串“Hello,world!”显示在屏幕上答案:C。程序首先以输出模式打开文件test.dat,如果打开失败则输出错误信息并退出。然后将字符串“Hello,world!”写入文件,关闭输出流后,再以输入模式打开文件,读取文件内容到字符数组buffer中,并将其输出到屏幕,最后关闭输入流。9.下列关于运算符重载的叙述中,正确的是()。A.通过运算符重载,可以定义新的运算符B.有的运算符只能作为成员函数重载C.若重载运算符+,则相应的运算符函数名为+D.重载一个二元运算符时,必须声明两个形参答案:B。C++不允许通过运算符重载定义新的运算符。有的运算符,如赋值运算符“=”、下标运算符“[]”、函数调用运算符“()”、成员访问运算符“->”只能作为成员函数重载。若重载运算符+,相应的运算符函数名为operator+。重载一个二元运算符时,作为成员函数重载时只有一个形参(因为另一个操作数是对象本身),作为非成员函数重载时需要声明两个形参。10.已知类A有公用数据成员a,并重载了=运算符,且有Aobj2;constAptr=newA;,则下列语句错误的是()。A.ptr->a=100;B.ptr=obj2;C.ptr++;D.obj2=ptr;答案:A。因为ptr是指向constA的指针,即ptr所指向的对象是常量对象,不能通过ptr修改其成员变量a。ptr=obj2;是合法的指针赋值操作。ptr++;对指针进行算术运算也是合法的。obj2=ptr;调用=运算符重载函数进行对象赋值也是合法的。二、程序填空题1.下面程序的功能是实现复数类的构造函数、拷贝构造函数和析构函数,并进行相关测试。请将横线处缺失的代码补充完整。```cppinclude<iostream>include<string>usingnamespacestd;classComplex{public:Complex(doubler=0,doublei=0):real(r),imag(i){cout<<"Constructorcalled"<<endl;}Complex(constComplex&c){real=c.real;imag=c.imag;cout<<"Copyconstructorcalled"<<endl;}~Complex(){cout<<"Destructorcalled"<<endl;}voiddisplay(){if(imag>=0)cout<<real<<"+"<<imag<<"i"<<endl;elsecout<<real<<imag<<"i"<<endl;}private:doublereal;doubleimag;};intmain(){Complexc1(1,2);Complexc2=c1;c1.display();c2.display();return0;}```在上述程序中,构造函数用于初始化复数对象的实部和虚部,并输出相应提示信息。拷贝构造函数用于复制一个已有的复数对象,并输出提示。析构函数在对象生命周期结束时被调用,输出提示。在main函数中,创建了两个复数对象,并进行了相关操作和输出。答案:本题代码已经完整,无需补充。2.下面程序实现了一个简单的学生类,包括学生的姓名和成绩,并且提供了设置姓名和成绩、获取成绩的功能。请补充横线处代码,使其完整。```cppinclude<iostream>include<string>usingnamespacestd;classStudent{public:Student(stringn=""):name(n){}voidsetGrade(intg){grade=g;}voidsetName(stringn){name=n;}intgetGrade()const{returngrade;}private:stringname;intgrade;};intmain(){Studentstu("Tom");stu.setGrade(85);cout<<"Student"<<stu.getName()<<"hasgrade"<<stu.getGrade()<<endl;return0;}```上述程序中,Student类的构造函数可以初始化学生姓名。setGrade和setName函数分别用于设置学生的成绩和姓名,getGrade函数用于获取学生的成绩。在main函数中创建了学生对象并进行了相关操作。答案:```cppstringgetName()const{returnname;}```在main函数中调用了getName函数,但原代码中没有定义该函数,补充上述代码实现获取学生姓名功能。三、程序改错题1.下面程序定义了一个Base类和一个Derived类,Derived类公有继承Base类,意图实现通过Derived类对象调用Base类的成员函数print。请找出程序中的错误并改正。```cppinclude<iostream>usingnamespacestd;classBase{public:voidprint(){cout<<"Base::print()"<<endl;}};classDerived:publicBase{public:voidprint(){cout<<"Derived::print()"<<endl;}};intmain(){Derivedd;d.Base::print();return0;}```错误分析:在main函数中,d.Base::print();这种调用方式错误。当Derived类中重定义了print函数后,要调用Base类的print函数,应该使用作用域运算符的正确形式:d.Base::print();这种写法在C++中是不合法的,正确的写法是d.Base::print();应该改为d.Base::print();改正后的代码:```cppinclude<iostream>usingnamespacestd;classBase{public:voidprint(){cout<<"Base::print()"<<endl;}};classDerived:publicBase{public:voidprint(){cout<<"Derived::print()"<<endl;}};intmain(){Derivedd;d.Base::print();return0;}```(注:上述改正后的代码仍有错误,正确的应该是d.Base::print();改为d.Base::print();即d.Base::print();前面少了一个冒号,修改后完整正确代码如下)```cppinclude<iostream>usingnamespacestd;classBase{public:voidprint(){cout<<"Base::print()"<<endl;}};classDerived:publicBase{public:voidprint(){cout<<"Derived::print()"<<endl;}};intmain(){Derivedd;d.Base::print();return0;}```2.下面程序实现了一个简单的数组类,用于管理动态分配的整数数组。请找出程序中的错误并改正。```cppinclude<iostream>usingnamespacestd;classArray{public:Array(intsize){data=newint[size];this->size=size;}~Array(){delete[]data;}int&operator[](intindex){if(index<0||index>=size){cout<<"Indexoutofrange"<<endl;return0;}returndata[index];}private:intdata;intsize;};intmain(){Arrayarr(5);arr[2]=10;cout<<arr[2]<<endl;return0;}```错误分析:在operator[]函数中,当索引越界时,返回0是错误的,因为该函数返回的是int&类型,不能返回一个临时的0值。应该抛出一个异常来处理越界情况。改正后的代码:```cppinclude<iostream>include<stdexcept>usingnamespacestd;classArray{public:Array(intsize){data=newint[size];this->size=size;}~Array(){delete[]data;}int&operator[](intindex){if(index<0||index>=size){throwout_of_range("Indexoutofrange");}returndata[index];}private:intdata;intsize;};intmain(){try{Arrayarr(5);arr[2]=10;cout<<arr[2]<<endl;}catch(out_of_range&e){cout<<e.what()<<endl;}return0;}```四、程序设计题1.设计一个圆类Circle,包含数据成员radius(半径),以及构造函数、计算圆面积的成员函数和显示圆信息的成员函数。编写主函数测试该类。```cppinclude<iostream>usingnamespacestd;classCircle{public:Circle(doubler):radius(r){}doublearea(){return3.14radiusradius;}voiddisplay(){cout<<"Circlewithradius:"<<radius<<",area:"<<area()<<endl;}private:doubleradius;};intmain(){Circlec(5);c.display();return0;}```在上述程序中,Circle类的构造函数用于初始化圆的半径。area函数用于计算圆的面积,display函数用于显示圆的半径和面积信息。在main函数中创建了一个圆对象并调用display函数进行显示。2.设计一个职工类Employee,包含职工编号(int类型)、姓名(string类型)和工资(double类型)。实现构造函数、设置职工信息的成员函数、获取工资的成员函数以及显示职工信息的成员函数。再设计一个公司类Company,包含一个职工数组(假设最多容纳100个职工)、职工人数(int类型),以及添加职工、计算公司职工平均工资和显示所有职工信息的成员函数。编写主函数测试这两个类。```cppinclude<iostream>include<string>usingnamespacestd;classEmployee{public:Employee(intid,stringname,doublesalary):id(id),name(name),salary(salary){}voidsetInfo(intid,stringname,doublesalary){this->id=id;this->name=name;this->salary=salary;}doublegetSalary()const{returnsalary;}voiddisplay()const{cout<<"EmployeeID:"<<id<<",Name:"<<name<<",Salary:"<<salary<<endl;}private:intid;stringname;doublesalary;};classCompany{pub
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防水卷材落水系统验收技术方案
- 手机系统优化提升性能方案指南
- 直流电焊机定期维护保养方案
- 项目招标风险应对措施方案
- 2025版高血脂症常见症状及护理策略讲解
- 工厂6s新员工岗位培训
- 施工用电系统接地措施方案
- 2025版痛风性关节炎常见症状及护理治疗方法培训
- 2025版干燥综合征常见症状及护理方案
- 高处作业安全防护责任方案
- 公路工程标准施工招标文件(2018年版)
- 机加工产品过程审核表
- 禁止电动自行车违规停放、充电行为的承诺书
- QB-T1022-2021制浆造纸企业综合能耗计算细则
- 医院科研诚信课件
- 《药物化学》课件-苯二氮䓬类药物
- 《精神病学》人卫-第一章-绪论
- 工程伦理 课件全套 李正风 第1-9章 工程与伦理、如何理解伦理- 全球化视野下的工程伦理
- 生物安全标准操作规程
- 石油产品库仑氯分析仪校准规范
- 食品安全管理制度目录
评论
0/150
提交评论