版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
c++考试题及答案一、单项选择题(每题2分,共20分)1.下列关于C++与C语言的关系描述中,错误的是()A.C++是C语言的超集,绝大多数C语言代码可以直接在C++编译器中编译运行B.C++在C语言基础上扩充了面向对象、泛型编程、异常处理等特性C.C++和C语言都是编译型、面向对象的程序设计语言D.C++支持函数重载、运算符重载等特性,C语言原生不支持这些特性2.下列关于C++引用的描述中,正确的是()A.引用在定义完成后可以重新绑定到其他同类型变量B.可以定义指向空值的引用,如int&ref=NULL;C.函数返回值类型为引用时,可以返回函数内部局部变量的引用D.引用作为函数形参传递时,不会为形参开辟额外的内存空间拷贝实参数据3.下列const关键字的用法中,语法正确的是()A.constinta=10;int*p=&a;B.intb=20;constint*p=&b;b=30;C.intc=30;int*constp;p=&c;D.constintd=40;int&ref=d;4.下列关于类访问权限的描述中,正确的是()A.类的private成员只能被类自身的成员函数访问,不能被任何其他函数访问B.类的protected成员在派生类中可以直接访问,在类外无法直接访问C.struct结构体类型中不能定义访问权限控制符,所有成员默认都是publicD.类的public成员只能被类外的全局函数访问,类的成员函数不能访问5.下列关于构造函数和析构函数的描述中,错误的是()A.构造函数支持重载,可以根据参数列表的不同提供多个构造函数B.析构函数没有参数,不支持重载,一个类只能有一个析构函数C.构造函数可以声明为虚函数,以实现多态构造D.当类中持有动态申请的堆内存时,需要自定义析构函数释放内存,避免内存泄漏6.下列关于虚函数与多态的描述中,正确的是()A.只要类中声明了虚函数,就可以在任何场景下实现运行时多态B.虚函数在基类中使用virtual关键字声明后,派生类中重写该函数时不需要再显式添加virtual关键字C.基类的析构函数声明为虚函数没有实际意义,不会影响程序的正确性D.函数重载和运算符重载都属于运行时多态的范畴7.下列关于运算符重载的描述中,正确的是()A.C++中所有运算符都可以重载,且重载后运算符的优先级和结合性可以改变B.重载运算符的函数不能设置默认参数C.赋值运算符=、下标运算符[]、函数调用运算符()、箭头运算符->只能作为类的成员函数重载D.重载运算符+时,可以修改内置类型int的加法规则,实现两个int相加返回字符串8.下列关于C++模板的描述中,错误的是()A.模板分为函数模板和类模板,是C++泛型编程的基础B.模板的实例化过程是在编译期完成的,不会产生运行时的额外开销C.类模板的成员函数在类外定义时,需要先声明模板参数列表,再指定类模板的具体类型D.函数模板可以直接处理不同类型的参数,不需要实例化,与普通函数完全一致9.下列关于STL容器的描述中,错误的是()A.vector是动态数组容器,内存空间连续,支持随机访问,在尾部插入删除元素的时间复杂度为O(1)(均摊)B.list是双向链表容器,内存空间不连续,不支持随机访问,在任意位置插入删除元素的时间复杂度为O(1)C.map是关联式容器,存储键值对,按键自动排序,支持通过键快速查找元素,底层采用哈希表实现D.deque是双端队列,支持在头部和尾部快速插入删除元素,也支持随机访问,但内存空间不是完全连续的10.下列关于C++动态内存管理的描述中,正确的是()A.new运算符和malloc函数的功能完全一致,都是申请指定大小的堆内存,返回void*类型指针B.使用new[]申请的数组内存,可以使用delete单个释放,不会产生内存泄漏或程序错误C.new运算符创建自定义类对象时,会自动调用类的构造函数,delete销毁对象时会自动调用析构函数D.申请内存失败时,new运算符和malloc函数都会返回NULL指针,可以通过判断返回值是否为NULL检查申请是否成功二、判断题(每题1分,共10分,正确填√,错误填×)1.C++中class定义的类默认访问权限是private,struct定义的结构体默认访问权限是public。2.构造函数可以声明为虚函数,析构函数不能声明为虚函数。3.静态成员函数属于整个类,没有this指针,不能直接访问类的非静态成员。4.函数重载要求同名函数的返回值类型必须不同,与参数列表无关。5.友元函数是类的特殊成员函数,可以访问类的私有和保护成员。6.包含纯虚函数的类称为抽象类,抽象类不能实例化对象,只能作为基类被继承。7.C++中为了提高传参效率,传递大型对象作为函数参数时,通常使用引用或指针传参,避免值传递的拷贝开销。8.vector容器的erase方法删除指定位置的元素时,会自动将被删除元素之后的所有元素向前移动,因此删除元素后迭代器可能失效。9.C++异常处理中,catch块的排列顺序不影响异常捕获结果,编译器会自动匹配最合适的异常类型。10.C++11中新增的智能指针unique_ptr是独占式智能指针,不支持拷贝和赋值,同一时刻只能有一个unique_ptr指向同一个对象。三、填空题(每空2分,共20分)1.C++面向对象编程的三大核心特性是____、____、____。2.若需要将全局函数func声明为类A的友元函数,使其能够访问A的私有成员,需要在类A的定义中添加语句____。3.C++中,在成员函数的参数列表后添加____关键字,可以限制该成员函数不能修改类的非静态成员变量。4.运行时多态的实现需要满足三个必要条件:公有继承、____、基类指针或引用指向派生类对象。5.派生类中重写基类虚函数时,C++11推荐使用____关键字显式标记,避免因函数签名不匹配导致重写失败。6.STL中作为“泛型指针”,用于连接容器和算法、实现对容器元素通用遍历的核心组件是____。7.C++标准库中std::map容器的底层默认采用____平衡二叉搜索树数据结构实现,保证元素有序存储和O(logn)时间复杂度的查找效率。8.使用new运算符动态申请包含10个int元素的堆数组,对应的语句为int*p=____;四、程序阅读题(每题10分,共30分,请写出下列程序的标准输出结果,若存在未定义行为需额外注明)1.阅读以下代码,写出运行结果:usingnamespacestd;classBase{public:Base(){cout<<"Base构造"<<endl;}~Base(){cout<<"Base析构"<<endl;}};classMember{public:Member(){cout<<"Member构造"<<endl;}~Member(){cout<<"Member析构"<<endl;}};classDerived:publicBase{public:Derived(){cout<<"Derived构造"<<endl;}~Derived(){cout<<"Derived析构"<<endl;}private:Memberm;};intmain(){Derivedd;return0;}2.阅读以下代码,写出运行结果,并指出代码中存在的潜在问题:usingnamespacestd;classA{public:virtualvoidfunc(){cout<<"A::func()"<<endl;}voidshow(){cout<<"A::show()"<<endl;}};classB:publicA{public:voidfunc()override{cout<<"B::func()"<<endl;}voidshow(){cout<<"B::show()"<<endl;}};intmain(){A*p=newB();p->func();p->show();deletep;Aa=B();a.func();a.show();return0;}3.阅读以下代码,写出不考虑编译器返回值优化(RVO/NRVO)场景下的运行结果:usingnamespacestd;classInteger{private:intval;public:Integer(intv=0):val(v){cout<<"普通构造,val="<<val<<endl;}Integer(constInteger&other){val=other.val;cout<<"拷贝构造,val="<<val<<endl;}Integer&operator=(constInteger&other){val=other.val;cout<<"赋值运算符,val="<<val<<endl;return*this;}Integeroperator+(constInteger&other){returnInteger(val+other.val);}Integer&operator++(){//前置++val++;return*this;}Integeroperator++(int){//后置++Integertemp=*this;val++;returntemp;}friendostream&operator<<(ostream&os,constInteger&i);};ostream&operator<<(ostream&os,constInteger&i){os<<i.val;returnos;}intmain(){Integera(5);Integerb=a;Integerc;c=a+b;cout<<"c="<<c<<endl;cout<<"++c="<<++c<<endl;cout<<"c++="<<c++<<endl;cout<<"c="<<c<<endl;return0;}五、程序设计题(每题10分,共20分,请按照需求编写C++代码,要求语法符合C++11及以上标准,逻辑清晰,可读性强)1.设计一个学生类CStudent,满足以下要求:(1)私有成员变量:int类型学号m_id,string类型姓名m_name,长度为3的double数组m_score存储三门课程的成绩;(2)公有成员函数:①带默认参数的构造函数:参数为学号(默认值0)、姓名(默认值"无名氏")、成绩数组指针(默认值nullptr,当传入有效指针时将三个成绩拷贝到m_score中,未传入时三个成绩初始化为0);②doublegetAvg():计算并返回三门课程的平均分;③voidshowInfo():输出学生的学号、姓名、三门课成绩、平均分,格式清晰;④voidsetInfo(intid,stringname,doublescores[]):设置学生的学号、姓名、三门课成绩;(3)在主函数中创建两个CStudent对象:第一个对象使用带参构造初始化(学号1001,姓名"张三",成绩为90、85、95);第二个对象使用默认构造创建,调用setInfo设置学号1002,姓名"李四",成绩为88、92、86;分别调用两个对象的showInfo方法输出信息。2.利用面向对象多态特性设计一个形状计算系统,满足以下要求:(1)定义抽象基类CShape,包含:①纯虚函数doublegetArea():用于计算形状面积;②纯虚函数voidshowInfo():用于输出形状的参数和面积;③虚析构函数,保证派生类对象能够正确释放;(2)从CShape公有派生圆形类CCircle:①私有成员变量doublem_r表示半径;②构造函数接收半径参数初始化m_r;③实现getArea()方法,计算圆形面积(π取3.1415926);④实现showInfo()方法,输出格式为“圆形:半径=X,面积=Y”,X、Y保留两位小数;(3)从CShape公有派生矩形类CRectangle:①私有成员变量doublem_width、m_height表示宽和高;②构造函数接收宽、高参数初始化成员变量;③实现getArea()方法,计算矩形面积(宽*高);④实现showInfo()方法,输出格式为“矩形:宽=X,高=Y,面积=Z”,保留两位小数;(4)主函数要求:①创建CShape类型的指针数组,长度为2,第一个元素指向半径为3.0的CCircle堆对象,第二个元素指向宽为4.0、高为5.0的CRectangle堆对象;②遍历指针数组,调用每个元素的showInfo()方法输出形状信息;③遍历数组累计所有形状的面积,输出“总面积为:X”,保留两位小数;④遍历数组释放所有堆对象内存,避免内存泄漏。参考答案及解析一、单项选择题1.答案:C。解析:C语言是面向过程的结构化程序设计语言,不具备面向对象的语法特性,C++是同时支持面向过程、面向对象、泛型编程的多范式编译型语言,因此C选项表述错误。A选项正确,C++设计之初即保持对C语言的向后兼容,绝大多数合规的C语言代码无需修改即可在C++环境下编译运行;B选项正确,C++在C语言基础上扩充了类与对象、继承、多态、模板、异常、智能指针等大量特性;D选项正确,函数重载和运算符重载依赖C++编译器的名字修饰(NameMangling)机制,C语言编译器不支持该机制,原生无法实现重载特性。2.答案:D。解析:引用在语法层面是已定义变量的别名,与原变量共享同一块内存空间,作为形参传递时仅传递底层地址,不需要拷贝实参的完整数据,因此传参效率与指针一致,D选项正确。A选项错误,引用必须在初始化时绑定到同类型的合法对象,绑定完成后无法重新指向其他变量;B选项错误,引用不存在空值,必须绑定到有效的内存对象,NULL本质是值为0的空指针常量,无法作为引用的绑定目标;C选项错误,函数内部的局部变量存储在栈区,函数执行结束后栈帧被销毁,局部变量的内存会被回收,返回局部变量的引用会产生悬垂引用,访问该引用属于未定义行为,可能导致程序崩溃或数据异常。3.答案:B。解析:constint*p表示指针指向的内容为const类型,无法通过指针p修改指向的内容,但原变量b是普通int类型,不受const修饰的限制,可以直接修改b的值,语法完全正确,B选项符合要求。A选项错误,&a的类型是constint*,隐式转换为int*会丢失const属性,允许通过指针修改const常量a的值,违反const语义,编译器会直接报错;C选项错误,const修饰指针本身时(const位于*右侧),指针是常量,必须在定义时完成初始化,定义后再进行赋值属于语法错误;D选项错误,d是constint类型的常量,绑定到非const引用会允许通过引用修改d的值,违反const常量的不可修改规则,编译器不允许该隐式转换。4.答案:B。解析:protected访问权限是专为继承场景设计的,基类的protected成员在公有继承和保护继承的派生类中可以直接访问,但在类的外部(非类成员、非友元)无法通过对象直接访问,B选项表述正确。A选项错误,类的private成员除了类自身的成员函数,还可以被类的友元函数、友元类访问;C选项错误,C++中的struct与class仅存在默认访问权限的差异,struct内部同样可以使用public/protected/private访问控制符,也可以定义成员函数、构造函数、析构函数等;D选项错误,public成员是类对外暴露的接口,既可以在类内部被成员函数访问,也可以在类外部通过对象访问。5.答案:C。解析:构造函数不能声明为虚函数,虚函数的调用依赖于对象内存中存储的虚函数表指针,而构造函数执行时对象尚未完成初始化,虚函数表指针还未被正确赋值,无法完成动态绑定,因此不存在虚构造函数的概念,C选项表述错误。A选项正确,构造函数支持重载,可以定义无参构造、带参构造、拷贝构造、移动构造等多个版本,满足不同的初始化需求;B选项正确,析构函数没有参数、没有返回值,无法通过参数差异实现重载,一个类只能有一个析构函数;D选项正确,默认合成的析构函数只会释放对象本身占用的栈内存,不会自动释放对象成员持有的堆内存、文件句柄、网络连接等资源,当类持有动态申请的资源时,必须自定义析构函数完成资源释放,避免内存泄漏或资源占用。6.答案:B。解析:基类中使用virtual声明的虚函数,在派生类中只要函数签名(返回值类型、函数名、参数列表、const修饰属性)与基类完全一致,即使不显式添加virtual关键字,该函数也会自动成为虚函数,C++11引入的override关键字可以显式标记虚函数重写,帮助编译器检查签名匹配问题,B选项正确。A选项错误,运行时多态的实现必须同时满足三个条件:类之间存在公有继承关系、派生类重写基类的虚函数、通过基类的指针或引用调用虚函数,三者缺一不可;C选项错误,当基类指针指向派生类的堆对象时,如果基类析构函数不是虚函数,delete基类指针时只会调用基类的析构函数,不会调用派生类的析构函数,会导致派生类持有的资源无法释放,产生内存泄漏,因此作为多态基类的析构函数必须声明为虚函数;D选项错误,函数重载、运算符重载、模板实例化都是在编译期确定调用版本,属于静态多态(编译期多态),只有虚函数实现的多态是在运行期根据对象实际类型确定调用版本,属于动态多态(运行时多态)。7.答案:C。解析:C++标准明确规定,赋值运算符=、下标运算符[]、函数调用运算符()、箭头成员访问运算符->必须作为类的成员函数重载,不能定义为全局函数,以保证这些运算符的调用语义与内置类型一致,C选项正确。A选项错误,C++中存在5个无法重载的运算符:成员访问运算符.、成员指针访问运算符.*、域解析符::、三目运算符?:、sizeof运算符(含C++11新增的alignof、typeid等运算符),且运算符重载不能改变原运算符的优先级、结合性和操作数个数;B选项错误,运算符重载本质是特殊的函数,可以设置默认参数,但默认参数不能改变运算符要求的操作数数量(如二元运算符不能通过默认参数变为一元运算符);D选项错误,运算符重载不能修改内置类型的运算规则,重载的运算符至少有一个操作数是自定义类类型,避免破坏内置类型的语法一致性。8.答案:D。解析:函数模板是生成具体类型函数的编译期蓝图,本身不是可直接执行的函数,编译器会根据调用时传入的实参类型推导模板参数,实例化出对应类型的具体函数后才能调用,并非不需要实例化,D选项表述错误。A选项正确,C++模板分为函数模板和类模板,是实现泛型编程、编写类型无关通用代码的核心基础;B选项正确,模板的实例化过程完全在编译期完成,实例化生成的代码与手写的特定类型代码执行效率完全一致,不会产生额外的运行时开销;C选项正确,类模板的成员函数在类外定义时,必须先声明模板参数列表,再通过类名<T>的形式指定类的模板类型,语法为template<typenameT>返回值类型类名<T>::函数名(参数列表)。9.答案:C。解析:std::map是有序关联式容器,存储pair<constKey,T>类型的键值对,按键的大小自动升序排序,底层默认采用红黑树(自平衡二叉搜索树)实现,查找、插入、删除的时间复杂度均为O(logn);采用哈希表实现、元素无序、平均查找时间复杂度O(1)的关联式容器是C++11新增的std::unordered_map,因此C选项表述错误。A选项正确,vector的底层是连续内存的动态数组,支持通过[]运算符随机访问任意位置元素,尾部插入删除元素仅在容量不足时需要扩容,均摊时间复杂度为O(1),中间位置插入删除需要移动后续元素,时间复杂度为O(n);B选项正确,list是双向循环链表,每个节点独立申请内存,不需要连续的地址空间,插入删除操作仅需要修改相邻节点的指针,不需要移动元素,时间复杂度为O(1),但不支持随机访问,访问任意位置元素需要遍历链表,时间复杂度为O(n);D选项正确,deque底层采用分段连续的内存块+中控器的结构,支持在头部和尾部以O(1)时间复杂度插入删除元素,也支持通过[]运算符随机访问,但内存不是整体连续的,中间位置插入删除的效率低于vector。10.答案:C。解析:new运算符在申请到足够的堆内存后,会自动调用对象的构造函数完成成员初始化,delete运算符在释放内存前会自动调用对象的析构函数完成资源清理,这是new/delete与C语言malloc/free的核心区别之一,C选项正确。A选项错误,malloc是C标准库函数,仅负责分配指定字节数的原始内存,不会调用构造函数,返回void*类型指针需要强制转换为目标类型才能使用;new是C++内置运算符,会根据目标类型自动计算所需内存大小,调用构造函数初始化,返回对应类型的指针,不需要强制转换;B选项错误,new[]申请的数组内存必须使用delete[]释放,如果使用delete释放数组,只会调用数组第一个元素的析构函数,剩余元素的析构函数不会执行,会导致内存泄漏,甚至触发程序崩溃;D选项错误,默认情况下new申请内存失败时会抛出std::bad_alloc类型的异常,只有使用new(std::nothrow)形式调用时,申请失败才会返回NULL空指针,而malloc申请失败时直接返回NULL。二、判断题1.答案:√。解析:class和struct在C++中都可以定义类,唯一的语法差异是默认访问权限:class默认继承方式和成员访问权限为private,struct默认继承方式和成员访问权限为public,以保持对C语言结构体的兼容性。2.答案:×。解析:构造函数不能声明为虚函数(原因见单选第5题解析),而作为多态基类使用的类,析构函数必须声明为虚函数,否则通过基类指针释放派生类对象时会产生资源泄漏。3.答案:√。解析:静态成员函数属于整个类,不绑定到具体的对象实例,调用时不会传递隐含的this指针,因此只能访问类的静态成员变量和静态成员函数,不能直接访问非静态成员(非静态成员必须绑定到具体对象才能访问)。4.答案:×。解析:函数重载的判断依据是函数的参数列表(参数个数、类型、顺序)不同,与返回值类型无关。如果两个函数的参数列表完全一致,仅返回值类型不同,编译器无法区分调用场景,会报语法错误。5.答案:×。解析:友元函数可以是全局函数或其他类的成员函数,不属于类的成员函数,只是通过friend关键字获得了访问类私有、保护成员的权限。友元关系不具有对称性(A是B的友元不代表B是A的友元),也不具有传递性(A是B的友元,B是C的友元不代表A是C的友元)。6.答案:√。解析:包含纯虚函数(语法为virtual函数返回类型函数名(参数列表)=0;)的类称为抽象类,抽象类无法实例化对象,只能作为基类被继承。派生类必须实现所有继承而来的纯虚函数才能成为具体类实例化对象,否则派生类仍然是抽象类。7.答案:√。解析:值传递时会调用对象的拷贝构造函数,生成实参的完整副本作为形参,对于存储大量数据的对象(如长字符串、大容量vector、复杂自定义类),拷贝的时间和空间开销很高。使用引用或指针传参时仅传递对象地址,不需要拷贝完整数据,效率更高;如果不需要在函数内修改对象,推荐使用const引用传参,兼顾效率和安全性。8.答案:√。解析:vector的内存空间是连续的,删除指定位置元素时,需要将该位置之后的所有元素向前移动一位以保持内存连续性,因此被删除位置及之后的所有迭代器、指针、引用都会失效,使用erase删除元素时需要接收其返回值(指向被删除元素下一个位置的有效迭代器),避免使用失效迭代器导致的未定义行为。9.答案:×。解析:catch块按照书写顺序从上到下匹配异常对象,只要找到第一个类型匹配的catch块就会执行异常处理,不会继续向后匹配。因此书写catch块时需要将派生类异常的catch块放在前面,基类异常的catch块放在后面,否则基类catch块会捕获所有派生类异常,导致后续的派生类catch块永远无法执行。10.答案:√。解析:std::unique_ptr是C++11引入的独占式智能指针,对其持有的堆内存拥有独占所有权,不支持普通的拷贝构造和拷贝赋值,只能通过std::move()转移所有权,当unique_ptr离开作用域时,会自动释放持有的堆内存,不需要手动调用delete,可以有效避免内存泄漏、重复释放等问题。三、填空题1.答案:封装、继承、多态(顺序可互换)2.答案:friendvoidfunc();3.答案:const4.答案:派生类重写基类的虚函数5.答案:override6.答案:迭代器7.答案:红黑树8.答案:newint[10]四、程序阅读题1.答案:输出顺序为:Base构造Member构造Derived构造Derived析构Member析构Base析构解析:派生类对象的构造顺序严格遵循以下规则:首先调用基类的构造函数,然后按照成员对象在类中声明的顺序调用成员对象的构造函数,最后调用派生类自身的构造函数。析构顺序与构造顺序完全相反:先调用派生类自身的析构函数,然后调用成员对象的析构函数,最后调用基类的析构函数。本题中Derived继承自Base,且有一个Member类型的成员m,因此构造时先执行Base构造,再执行Member构造,最后执行Derived构造;析构时顺序完全反转。2.答案:输出结果为:B::func()A::show()A::func()A::show()潜在问题:基类A的析构函数没有声明为虚函数,执行deletep时,p是基类A类型的指针,指向派生类B的堆对象,由于析构函数不是虚函数,只会调用A的析构函数,不会调用B的析构函数,如果B类持有动态申请的资源,会导致内存泄漏。解析:(1)第一部分p是基类指针指向派生类对象,调用func()时,func是虚函数,会触发动态绑定,根据对象实际类型(B类)调用B::func();而show()不是虚函数,会执行静态绑定,根据指针的静态类型(A类)调用A::show()。(2)第二部分Aa=B()会发生对象切片,派生类B对象中属于基类A的部分被拷贝构造给a,a是纯粹的A类对象,因此无论是调用func()还是show(),都执行A类的版本。(3)由于基类析构函数不是虚函数,deletep属于未定义行为,本题中两个类都没有自定义析构函数,也没有持有堆资源,因此不会影响输出结果,但实际开发中必须将多态基类的析构函数声明为虚函数。3.答案:不考虑RVO优化时的输出顺序为:普通构造,val=5拷贝构造,val=5普通构造,val=0普通构造,val=10拷贝构造,val=10赋值运算符,val=10c=10++c=11拷贝构造,val=11c++=11c=12解析:逐行执行流程如下:(1)Integera(5)调用带int参数的普通构造函数,输出“普通构造,val=5”;(2)Integerb=a是拷贝初始化,调用拷贝构造函数,输出“拷贝构造,val=5”;(3)Integerc调用无参构造(默认参数v=0),输出“普通构造,val=0”;(4)c=a+b时,先执行operator+,函数内部创建临时对象Integer(10),调用普通构造输出“普通构造,val=10”,返回该临时对象时,由于不考虑RVO,会调用拷贝构造将局部临时对象拷贝到外层的临时对象,输出“拷贝构造,val=10”;随后将外层临时对象赋值给已经存在的c,调用赋值运算符,输出“赋值运算符,val=10”;(5)输出c的值为10,即“c=10”;(6)++c调用前置++运算符,c的val自增为11,返回c自身,因此输出“++c=11”;(7)c++调用后置++运算符,函数内部先创建temp对象拷贝当前c的值(val=11),调用拷贝构造输出“拷贝构造,val=11”,然后将c的val自增为12,返回temp临时对象,输出“c++=11”;(8)最后输出c当前的值12,即“c=12”。若开启编译器RVO优化,operator+返回临时对象时的拷贝构造会被优化掉,减少一次拷贝构造的输出,但考试场景下以标准语法流程为准。五、程序设计题1.参考代码:usingnamespacestd;classCStudent{private:intm_id;stringm_name;doublem_score[3];public:CStudent(intid=0,stringname="无名氏",double*scores=nullptr):m_id(id),m_name(name){if(scores!=nullptr){for(inti=0;i<3;i++){m_score[i]=scores[i];}}else{for(inti=0;i<3;i++){m_score[i]=0;}}}doublegetAvg(){doublesum=0;for(inti=0;i<3;i++){sum+=m_score[i];}returnsum/3.0;}voidshowInfo(){cout<<fixed<<setprecision(1);cout<<"学号:"<<m_id<<",姓名:"<<m_name<<endl;cout<<"三门课成绩:"<<m_score[0]<<"、"<<m_score[1]<<"、"<<m_score[2]<<endl;cout<<"平均分:"<<getAvg()<<endl<<"----------------"<<endl;}voidsetInfo(intid,stringname,doublescores[]){m_id=id;m_name=name;for(inti=0;i<3;i++){m_score[i]=scores[i];}}};intmain(){doubles1[]={90,85,95};CStudentzhang(1001,"张三",s1);zhang.showInfo();CStudentli;doubles2[]={88,92,86};li.setInfo(1002,"李四",s2)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 演练产妇发作应急预案(3篇)
- 封闭高速施工方案模板(3篇)
- 2026福建省盐业集团有限责任公司招聘3人考试备考题库及答案解析
- 2026年普通小学教育行业投资研究报告及未来五至十年增长动能与投资价值分析
- 2026宁德人民医院编外人员招聘8人笔试模拟试题及答案解析
- 2026重庆市万州区走马镇养老协管员非全日制公益性岗位招聘16人笔试参考题库及答案解析
- 2026年开封市龙亭区柳园口乡卫生院招聘考试备考试题及答案解析
- 2026年泉州文化旅游发展集团有限公司人员招聘考试备考试题及答案
- 2026广东广州市荔湾区高校毕业生基层公共就业创业服务岗位招募56人考试参考题库及答案解析
- 西安交通大学校内公开选聘科级干部10名笔试模拟试题及答案解析
- 2026年重症5c培训试题(附答案)
- 2026年《中国下肢深静脉血栓诊疗临床指南(2026版)》
- 2026年国家公务员考试《申论》真题卷(行政执法)及答案解析
- 水库放空技术导则(NBT10966-2022 )
- 2026年CSCO胃癌诊疗指南解读课件
- 心梗三项临床意义标准化解读
- 2026年辅警时事政治考查试题含答案
- 建筑环境与能源测试技术 第4版 课件全套 第1-10章 测量及测量仪表的基本知识 -建筑环境综合测试技术及应用
- 检验科仪器设备校准验证程序性文件
- 2026年湖南省选调生面试模拟题集
- 2026年针灸推拿医师高频面试题包含详细解答
评论
0/150
提交评论