cpp考试题库及答案解析(2026版)_第1页
cpp考试题库及答案解析(2026版)_第2页
cpp考试题库及答案解析(2026版)_第3页
cpp考试题库及答案解析(2026版)_第4页
cpp考试题库及答案解析(2026版)_第5页
已阅读5页,还剩37页未读, 继续免费阅读

付费下载

下载本文档

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

文档简介

cpp考试题库及答案解析(2026版)一、单项选择题(共15题,每题2分,总计30分)1.下列特性中,属于ISOC++23标准正式纳入、且在主流编译器(GCC14、Clang17、MSVC202217.8及以上版本)默认编译模式下启用的是()A.无栈协程(Coroutines)B.std::println类型安全格式化输出C.概念(Concepts)约束D.模块(Modules)编译模型【答案】B【解析】本题考查C++标准版本特性的对应关系,是2026年教考大纲新增的核心考点。选项A、C、D均为C++20标准正式发布的核心特性,其中协程用于简化异步逻辑实现,概念用于约束模板参数、优化编译报错信息,模块用于替代传统头文件包含模型、消除宏泄漏并提升30%以上的编译效率;选项B的std::println是C++23在<print>头文件中新增的标准库函数,基于std::format实现类型安全的变长参数格式化输出,无需依赖iostream体系的重载插入运算符,官方测试数据显示其格式化输出性能较std::cout提升42%以上,目前已在所有主流编译器的最新稳定版中默认支持。2.下列关于C++常量求值相关关键字的描述,符合标准规范的是()A.constexpr修饰的函数必须在所有调用场景下都产生编译期常量结果B.consteval修饰的函数称为即时函数,所有调用必须产生编译期常量,否则编译报错C.constinit修饰的变量允许在运行期初始化,仅要求初始化表达式具有常量属性即可D.const修饰的变量一定是编译期常量,可作为数组长度使用【答案】B【解析】本题考查常量求值关键字的语义差异。选项A错误,constexpr函数为兼顾灵活性,允许在传入非常量参数时在运行期执行,仅要求当传入参数为常量表达式时必须能在编译期求值;选项C错误,constinit的核心作用是解决静态变量初始化顺序问题,要求变量必须在静态初始化阶段完成初始化,不允许运行期动态初始化,但constinit修饰的变量本身可在运行期被修改;选项D错误,const修饰的变量如果初始化值来自运行期输入(如函数返回值、用户输入),则属于运行期常量,不能作为数组长度、非类型模板参数等需要编译期常量的场景使用;选项B是consteval的标准定义,即时函数不存在运行期执行路径,所有调用点必须能在编译期算出结果,否则触发编译错误。3.下列关于定位new(placementnew)内存操作的描述,正确的是()已知测试代码片段:usingnamespacestd;classA{public:A(){cout<<"A";}~A(){cout<<"~A";}};intmain(){char*buf=newchar[sizeof(A)*3];A*p1=new(buf)A();A*p2=new(buf+sizeof(A))A();A*p3=new(buf+2*sizeof(A))A();//待填写释放逻辑return0;}A.直接使用delete[]buf;即可自动调用3个A对象的析构函数并释放内存B.需要先依次调用p1->~A()、p2->~A()、p3->~A(),再调用delete[]buf;C.调用deletep1;deletep2;deletep3;即可完成全部内存释放D.定位new分配的对象无需手动调用析构函数,buf的内存由系统自动回收【答案】B【解析】本题考查定位new的生命周期管理规则。定位new是在已分配的内存地址上直接调用构造函数初始化对象,本身不会申请新的堆内存,因此释放时必须先手动调用所有构造对象的析构函数(执行资源清理逻辑),再释放最初申请的底层内存缓冲区。选项A错误,delete[]buf仅会释放char数组的原始内存,不会自动调用A类型对象的析构函数,若A持有堆内存、文件句柄等资源会造成明确的资源泄漏;选项C错误,p1/p2/p3指向的内存属于buf数组的连续内存片段,并非通过普通new单独申请,直接对其调用delete会重复释放内存、触发未定义行为;选项D错误,buf是通过new[]在堆上分配的内存,不会被系统自动回收,且构造的A对象析构函数不会被自动调用。4.下列关于C++类型转换运算符的使用场景,符合标准规范且不会触发未定义行为的是()A.使用const_cast去除constint常量的const属性后修改其值B.使用static_cast将基类指针转换为派生类指针,基类指针实际指向基类对象C.使用dynamic_cast对多态类型的指针进行下行转换,转换失败时返回nullptrD.使用reinterpret_cast将float类型变量转换为int类型,实现浮点数的整数截断【答案】C【解析】本题考查四类强制类型转换的适用边界。选项A错误,const_cast仅能用于去除原本为非const类型对象的const限定,如果原对象是编译期const常量,修改其值会触发未定义行为,通常会被编译器常量折叠优化导致修改完全失效;选项B错误,static_cast不做运行时类型检查,如果基类指针实际指向基类对象,强行转换为派生类指针后访问派生类独有成员会访问非法内存,触发段错误等未定义行为,该场景必须使用具备运行时检查能力的dynamic_cast;选项C正确,dynamic_cast专门用于含虚函数的多态类型的安全下行转换,指针转换失败时返回nullptr,引用转换失败时抛出std::bad_cast异常,是C++中唯一支持运行时类型识别(RTTI)的转换运算符;选项D错误,浮点数的整数截断应使用static_cast完成数值转换,reinterpret_cast仅做二进制位的重新解释,不会执行数值层面的转换逻辑,会得到完全不符合预期的结果。5.下列关于STL标准容器的操作时间复杂度描述,正确的是()A.std::vector在任意位置插入元素的时间复杂度均为O(1)B.std::list在已知插入位置迭代器的前提下,插入元素的时间复杂度为O(1)C.std::map基于哈希表实现,查找元素的平均时间复杂度为O(1)D.std::unordered_map基于红黑树实现,查找元素的最坏时间复杂度为O(logn)【答案】B【解析】本题考查STL容器的底层实现与性能特征。选项A错误,std::vector是连续内存的动态数组,在尾部插入元素的摊还时间复杂度为O(1),但在中间或头部插入元素需要移动插入点后续所有元素,时间复杂度为O(n);选项B正确,std::list是双向循环链表,每个节点单独分配内存,在已知迭代器位置插入元素时仅需修改相邻节点的前后指针,无需移动元素,时间复杂度为O(1),但需要注意定位到目标插入位置的遍历过程时间复杂度为O(n);选项C错误,std::map基于红黑树(有序平衡二叉树)实现,查找、插入、删除操作的时间复杂度均稳定为O(logn),元素按比较器规则有序存储;选项D错误,std::unordered_map基于开链法实现的哈希表存储,平均查找复杂度为O(1),当所有元素哈希冲突退化为链表时最坏时间复杂度为O(n)。6.下列关于C++多态与对象生命周期的描述,正确的是()A.构造函数可以声明为虚函数,在创建派生类对象时实现动态绑定B.基类声明虚析构函数后,通过基类指针delete派生类对象时会正确调用派生类析构函数C.在基类构造函数中调用虚函数,会自动绑定到派生类的覆写版本D.析构函数中调用虚函数会触发动态绑定,执行派生类的覆写版本【答案】B【解析】本题考查多态的适用场景与虚析构的核心作用。选项A错误,构造函数执行时对象的完整类型尚未构建完成,虚表指针未初始化到正确位置,C++标准明确禁止构造函数声明为虚函数;选项B正确,基类声明虚析构函数是实现多态销毁的必要条件,若基类析构为非虚,通过基类指针delete派生类对象时仅会执行基类析构函数,造成派生类资源泄漏的未定义行为;选项C、D错误,构造和析构过程中,对象的动态类型为当前正在构造/析构的类类型,此时调用虚函数不会触发动态绑定,只会执行当前类对应的函数版本,避免调用到尚未完成构造或已经被析构的派生类成员。7.下列关于C++智能指针的描述,错误的是()A.std::unique_ptr具备独占所有权语义,不允许拷贝,仅支持移动转移所有权B.std::shared_ptr通过引用计数实现共享所有权,循环引用会导致内存泄漏C.std::weak_ptr是shared_ptr的辅助智能指针,不增加引用计数,可解决循环引用问题D.std::make_shared创建数组类型对象的功能从C++11标准开始支持【答案】D【解析】本题考查智能指针的标准演进与使用规则。选项A、B、C均符合智能指针的标准语义:unique_ptr独占内存所有权,离开作用域自动释放资源;shared_ptr通过控制块的引用计数管理资源生命周期,当两个对象互相持有对方的shared_ptr时会形成引用环导致计数无法归零;weak_ptr作为弱引用不持有资源所有权,可通过lock()方法获得有效的shared_ptr实例,用于打破循环引用。选项D错误,C++11版本的std::make_shared仅支持创建单个对象,直到C++20标准才正式支持传入数组边界创建动态数组对象,并补充了shared_ptr的[]运算符重载用于数组元素访问。8.下列关于C++20三路比较运算符<=>的描述,正确的是()A.定义<=>运算符后,编译器不会自动生成<、<=、>、>=的重载实现B.<=>返回std::strong_ordering类型时,代表比较的两个值具备等价可替换性C.浮点数的默认<=>比较返回std::strong_ordering类型D.<=>运算符可以被重载为全局普通函数,不能作为类成员函数【答案】B【解析】本题考查三路比较运算符的语义规则。选项A错误,用户为类定义<=>运算符后,编译器会自动生成全部四个关系比较运算符的重载,大幅减少比较逻辑的重复代码;选项B正确,std::strong_ordering代表强序关系,两个相等的值完全等价,可互相替换,比如整数类型的比较就属于强序;选项C错误,浮点数因为存在NaN(非数值)的特殊值,不满足强序要求,默认比较返回std::partial_ordering类型;选项D错误,<=>运算符既可以作为类成员函数实现,也可以作为全局函数重载,符合普通运算符的重载规则。9.下列运算符中,允许被用户重载的是()A.作用域解析运算符::B.成员访问运算符.C.条件运算符?:D.函数调用运算符()【答案】D【解析】本题考查运算符重载的边界限制。C++标准明确规定5个运算符不允许被重载,分别是::(作用域解析)、.(成员访问)、.*(成员指针访问)、?:(三目条件)、sizeof(长度计算),避免重载导致的语义混乱。选项D的函数调用运算符()允许被重载,是函数对象、lambda表达式的核心实现基础,重载后可让类对象像普通函数一样被调用。10.下列关于C++异常安全等级的描述,对应“强异常安全保证”的是()A.异常抛出后,程序资源不泄漏,对象状态保持一致且回滚到操作执行前的状态B.异常抛出后,程序资源不泄漏,对象状态保持有效但不保证与操作前一致C.操作过程中不会抛出任何异常,总能完成预期功能D.异常抛出后可能出现资源泄漏、对象状态损坏的未定义行为【答案】A【解析】本题考查异常安全的三个标准等级。选项B为基本异常安全保证,要求资源不泄漏、对象状态有效,但可能发生不可逆的状态修改;选项C为不抛异常保证(noexcept),要求操作永远不会抛出异常,是移动构造、析构函数等场景的推荐异常级别;选项A为强异常安全保证,通常通过RAII技术、copy-and-swap策略实现,异常触发后所有修改回滚,对象状态与操作执行前完全一致;选项D为无异常安全保证,是不符合规范的代码写法。11.下列关于右值引用与移动语义的描述,正确的是()A.std::move的本质是将传入参数强制转换为右值引用,触发移动构造或移动赋值B.右值引用本身是右值,可以直接被移动C.移动构造函数执行后,被移动的对象必须处于析构安全的状态,且不能再被使用D.传入std::forward的左值参数会被无条件转换为右值,实现完美转发【答案】A【解析】本题考查移动语义的核心逻辑。选项B错误,右值引用类型的变量本身是左值,因为它有名字、可以取地址,直接传入需要右值的场景不会触发移动;选项C错误,被移动后的对象需要处于有效但未指定的状态,要求可以安全析构、可以被重新赋值,但并没有禁止后续使用;选项D错误,std::forward会根据参数的原始值类别进行转发,左值参数会被转发为左值,右值参数会被转发为右值,避免值类别丢失。12.类的静态成员变量的初始化方式,符合C++标准的是()A.在类定义体内直接初始化普通静态成员变量B.在类内声明constexpr静态成员变量,必须在类外再次定义才能取地址C.静态成员变量属于整个类所有,不隶属于某个具体对象,同类的所有对象共享同一份静态成员D.静态成员函数可以访问类的所有普通成员变量和成员函数【答案】C【解析】本题考查静态成员的规则。选项A错误,普通静态成员变量必须在类外进行初始化,类内仅能做声明;选项B错误,C++17之后constexpr静态成员变量具备内联属性,类内初始化后无需类外定义即可直接使用、取地址;选项D错误,静态成员函数没有this指针,仅能访问类的静态成员,不能访问普通非静态成员;选项C是静态成员的核心语义,静态成员存储在全局数据区,不占对象的内存空间,所有实例共享同一份数据。13.下列关于const成员函数的描述,正确的是()A.const成员函数内部不能修改类的任何成员变量B.const对象只能调用const成员函数,不能调用非const成员函数C.const成员函数不能被非const对象调用D.const成员函数的this指针类型是指向类类型的普通指针【答案】B【解析】本题考查const成员函数的语义。选项A错误,const成员函数内部可以修改被mutable关键字修饰的成员变量,这类成员通常用于缓存、统计计数等不影响对象逻辑状态的场景;选项C错误,非const对象既可以调用const成员函数,也可以调用非const成员函数,const成员函数是承诺不会修改对象状态的接口;选项D错误,const成员函数的this指针是constT*类型,不允许通过this指针修改普通成员;选项B正确,const对象承诺自身状态不会被修改,因此仅能调用同样承诺不修改状态的const成员函数,若允许调用非const成员函数则可能打破const限定。14.匿名命名空间的核心特性是()A.匿名命名空间内的标识符具备外部链接属性,可以被其他编译单元访问B.匿名命名空间的作用是替代static关键字,将标识符的作用域限制在当前编译单元内C.匿名命名空间可以在多个编译单元中定义同名内容,链接时不会产生冲突D.匿名命名空间内的成员访问必须加命名空间前缀【答案】B【解析】本题考查命名空间的链接属性。选项A错误,匿名命名空间内的所有标识符都具备内部链接属性,仅能在当前编译单元内访问,相当于C语言中static修饰的全局作用域标识符;选项C错误,匿名命名空间会由编译器生成一个唯一的内部命名空间名,其他编译单元的匿名命名空间是完全独立的,不能跨单元访问;选项D错误,匿名命名空间的成员在当前编译单元内可以直接访问,无需加命名空间前缀;选项B是匿名命名空间的设计目的,C++标准推荐使用匿名命名空间替代旧式的static全局声明,实现更灵活的编译单元内作用域控制。15.下列关键字中,不属于C++20协程核心关键字的是()A.co_awaitB.co_yieldC.co_returnD.co_async【答案】D【解析】本题考查C++20协程的基本语法组成。C++20协程是无栈协程实现,三个核心关键字分别为:co_await用于挂起协程等待异步操作完成,co_yield用于生成器模式下产出值并挂起协程,co_return用于协程执行完成返回结果。目前标准中不存在co_async关键字,异步调度逻辑由协程的promise_type和调度器实现。二、多项选择题(共10题,每题3分,总计30分,多选、少选、错选均不得分)1.下列关于C++继承与访问权限的描述,错误的有()A.私有继承模式下,基类的公有成员在派生类中访问权限为保护B.保护继承模式下,派生类对象可以在类外访问基类的公有成员C.虚继承的核心作用是解决菱形继承场景下的二义性与数据冗余问题D.派生类的成员函数可以直接访问基类的所有私有成员【答案】ABD【解析】选项A错误,私有继承下基类的公有、保护成员在派生类中均为私有权限,仅能被派生类内部访问;选项B错误,保护继承下基类的公有成员在派生类中为保护权限,无法通过派生类对象在类外访问;选项D错误,派生类成员函数仅能访问基类的公有和保护成员,基类的私有成员对派生类不可见,需通过基类的公有/保护接口访问;选项C为虚继承的标准设计目标,通过共享虚基类子对象避免菱形继承下的多份基类副本问题。2.下列迭代器类型中,std::list容器的迭代器支持的操作有()A.前缀/后缀自增(++it、it++)B.前缀/后缀自减(--it、it--)C.随机偏移访问(it+n)D.两个迭代器比较大小(it1<it2)【答案】AB【解析】std::list的迭代器属于双向迭代器,支持自增、自减操作向前/向后遍历,支持解引用访问元素,支持==、!=判断相等性,但不支持随机偏移(仅随机访问迭代器支持+、-偏移操作),也不支持<、>等大小比较(因为链表元素内存不连续,迭代器位置没有顺序关系)。随机访问迭代器是std::vector、std::array、std::deque等连续内存容器的迭代器类型。3.下列C++20范围库(std::ranges)的特性描述,正确的有()A.范围库的算法支持直接传入容器作为操作对象,无需显式传入begin/end迭代器对B.范围视图(views)采用惰性求值机制,仅在遍历到对应元素时才执行计算逻辑【答案】ABC【解析】选项D错误,范围视图是对原容器的轻量级封装,不会持有数据副本,默认情况下视图操作不会修改原容器内容,例如views::filter、views::transform等适配器仅在遍历时实时计算结果,不会改动原容器元素;选项A、B、C均为范围库的核心优势:简化算法调用接口、惰性求值降低不必要的计算开销、管道操作提升代码可读性。4.下列场景中,会触发C++移动构造函数调用的有()A.用临时对象(纯右值)初始化同类型对象B.用std::move转换后的左值初始化同类型对象C.函数按值返回局部对象时,满足返回值优化(RVO)条件的场景D.用一个左值对象初始化另一个同类型对象【答案】AB【解析】选项C错误,满足RVO条件的场景下编译器会直接在调用方的内存空间构造对象,不会调用拷贝或移动构造函数;选项D错误,直接用左值初始化对象会触发拷贝构造函数,除非显式通过std::move转为右值;选项A、B均为右值初始化场景,会优先调用移动构造函数转移资源,避免深拷贝开销。5.下列关于noexcept关键字的描述,正确的有()A.析构函数默认是noexcept的,若显式声明析构函数为noexcept(false),则抛出异常时不会触发std::terminateB.移动构造函数声明为noexcept可以让STL容器在扩容时优先使用移动而非拷贝,提升性能C.noexcept是函数接口的一部分,调用方可以根据函数的noexcept属性选择最优实现逻辑D.标记为noexcept的函数内部若抛出异常且未被捕获,会直接触发std::terminate终止程序【答案】BCD【解析】选项A错误,C++11及以后的标准中析构函数默认为noexcept,即使显式声明为noexcept(false),若析构函数在栈展开过程中抛出异常,仍然会触发std::terminate,因为栈展开过程中如果再次抛出异常会导致栈状态无法处理;选项B正确,std::vector等容器扩容时,为保证强异常安全,仅当元素的移动构造函数为noexcept时才会使用移动操作,否则会调用拷贝构造函数避免异常导致的对象状态损坏;选项C、D均为noexcept的标准语义,noexcept承诺函数不会抛出异常,一旦抛出未捕获异常会直接终止程序。6.下列关于C++单一定义规则(ODR)的描述,正确的有()A.同一个编译单元内,函数、变量、类的定义只能出现一次B.跨编译单元的inline函数定义必须完全一致,否则会触发未定义行为C.类的成员函数在类内定义时,默认是inline函数D.全局变量在头文件中定义时,即使不加inline也不会产生链接重复定义错误【答案】ABC【解析】选项D错误,普通全局变量具备外部链接属性,在头文件中定义后会被所有包含该头文件的编译单元生成一份定义,链接时触发重复定义错误,C++17支持inline变量,头文件中定义inline全局变量不会触发重复定义,链接器会合并为同一份实体;选项A、B、C均符合ODR规则要求:同一编译单元内实体不能重复定义,跨单元的inline实体必须保持定义完全一致,类内定义的成员函数默认为inline属性。7.下列关于lambda表达式的描述,正确的有()A.值捕获的变量在lambda定义时被拷贝,后续原变量的修改不会影响lambda内部的值B.引用捕获的变量需要确保lambda执行时变量仍然有效,否则会出现悬空引用C.采用mutable修饰的lambda可以修改值捕获的变量副本D.泛型lambda通过auto参数实现,底层等价于模板化的函数调用运算符【答案】ABCD【解析】本题考查lambda的捕获与语义规则:值捕获在lambda定义时完成拷贝,副本与原变量独立;引用捕获仅绑定变量引用,若变量提前销毁会触发悬空引用的未定义行为;默认情况下lambda的operator()是const属性,无法修改值捕获的副本,加mutable修饰后可以修改副本;C++14引入的泛型lambda支持auto参数,编译器会根据调用时的参数类型生成对应的模板实例,是C++20引入模板lambda的基础。8.下列关于C++23显式this参数(deducingthis)的应用场景,正确的有()A.可以消除const与非const成员函数的重复实现,通过一次模板化实现覆盖所有场景B.可以简化CRTP(奇异递归模板模式)的写法,无需将派生类作为模板参数传入基类C.可以实现递归lambda,无需额外使用std::function存储lambda对象D.可以替代虚函数实现静态多态,性能优于传统虚函数多态【答案】ABCD【解析】显式this参数是C++23引入的核心语法特性,允许将this指针作为函数的显式参数,结合模板推导实现更灵活的成员函数逻辑:通过对this参数的const、值类别约束,可一次性实现const、非const、左值、右值的重载版本;CRTP场景下可以直接推导派生类类型,减少模板参数的冗余传递;递归lambda场景下可通过this参数接收lambda自身,无需依赖std::function的类型擦除开销;结合模板推导可以实现完全静态绑定的多态,没有虚表指针的间接调用开销,性能更优。9.下列场景中,会导致std::shared_ptr循环引用的有()A.两个对象互相持有对方的std::shared_ptr成员B.对象持有指向自身的std::shared_ptr成员C.两个对象互相持有对方的std::weak_ptr成员D.用std::weak_ptr观察std::shared_ptr管理的对象【答案】AB【解析】循环引用的核心是引用计数形成闭环无法归零:两个对象互相持有shared_ptr时,双方的引用计数至少为1,永远无法释放;对象持有自身的shared_ptr会导致对象引用计数至少为1,离开作用域后计数无法归零,造成内存泄漏。选项C、D中的weak_ptr不增加引用计数,不会形成引用环,是解决循环引用的标准方式。10.下列关于C++异常处理流程的描述,正确的有()A.抛出异常后,程序会沿着调用栈向上查找匹配的catch块,过程中会析构所有栈上的局部对象(栈展开)B.catch块按照编写顺序匹配异常类型,不会自动选择最优匹配C.catch(...)可以捕获所有类型的异常,包括未被系统识别的硬件异常D.异常被catch块捕获后,若不重新抛出,程序会从catch块之后的位置继续执行【答案】ABD【解析】选项C错误,catch(...)仅能捕获C++throw语句抛出的异常,对于硬件触发的段错误、除零错误等操作系统层面的异常无法捕获,这类异常需要通过操作系统的信号机制处理;选项A是栈展开的标准流程,栈上的RAII对象会在栈展开过程中正常析构,保证资源释放;选项B正确,catch块的匹配是按顺序进行的,若将捕获基类类型的catch块放在派生类之前,会导致派生类异常被基类catch块拦截,无法进入正确的处理分支;选项D为异常处理的基本流程,捕获后程序恢复正常执行流。三、程序填空题(共3题,每空2分,总计20分)1.以下代码基于C++20概念与范围库实现了一个通用的降序排序函数,可支持任意符合随机访问迭代器要求的容器类型,请补全空缺代码:template<typenameContainer>conceptSortableContainer=requires(Containerc){{std::ranges::begin(c)}->std::random_access_iterator;{*std::ranges::begin(c)}->std::totally_ordered;};voiddesc_sort(SortableContainerauto&cont){std::ranges::sort(____(1)____,____(2)____);}intmain(){std::vector<int>vec={3,1,4,1,5,9,2,6};desc_sort(vec);}return0;}【答案】(1)cont;(2)std::ranges::greater{}【解析】空(1)处为std::ranges::sort的范围参数,范围库算法支持直接传入容器作为操作对象,无需显式传入begin/end迭代器对;空(2)处为降序排序的比较器,std::ranges::greater可自动推导元素类型,无需显式指定模板参数,实现从大到小的排序逻辑。2.以下代码实现了简化版的std::unique_ptr,具备独占所有权、自动释放资源的能力,请补全空缺代码:template<typenameT>classMyUniquePtr{private:T*ptr;public:explicitMyUniquePtr(T*p=nullptr):ptr(p){}~MyUniquePtr(){deleteptr;}//禁止拷贝构造与拷贝赋值MyUniquePtr(constMyUniquePtr&)=delete;MyUniquePtr&operator=(constMyUniquePtr&)=delete;//移动构造MyUniquePtr(MyUniquePtr&&other)noexcept:ptr(other.ptr){____(3)____;}//移动赋值MyUniquePtr&operator=(MyUniquePtr&&other)noexcept{if(this!=&other){deleteptr;ptr=other.ptr;other.ptr=nullptr;}return*this;}T&operator*()const{return*ptr;}T*operator->()const{returnptr;}T*get()const{returnptr;}};【答案】(3)other.ptr=nullptr【解析】移动构造的核心是转移资源所有权,将源对象的指针拷贝到当前对象后,必须将源对象的指针置为空,避免源对象析构时释放已经转移的内存,造成doublefree的未定义行为。3.以下代码基于C++20协程实现了无限生成斐波那契数列的生成器,请补全空缺部分:structFibGenerator{structpromise_type{uint64_tcurrent_value;FibGeneratorget_return_object(){returnFibGenerator{std::coroutine_handle<promise_type>::from_promise(*this)};}std::suspend_alwaysinitial_suspend()noexcept{return{};}std::suspend_alwaysfinal_suspend()noexcept{return{};}std::suspend_alwaysyield_value(uint64_tval)noexcept{current_value=val;return{};}voidreturn_void(){}voidunhandled_exception(){throw;}};std::coroutine_h

温馨提示

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

评论

0/150

提交评论