版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C++程序设计及题集(含答案)C++作为兼容C语言的多范式通用编程语言,兼具底层硬件操作能力与高层抽象机制,是系统软件开发、高性能服务开发、游戏引擎、嵌入式开发等领域的核心编程语言。掌握C++程序设计需要建立从语法规则到内存模型、从面向对象到泛型编程的完整知识体系,同时结合针对性练习规避常见编码误区。首先梳理核心知识模块的关键规则与易混点:第一,基础语法与类型系统。C++的基本数据类型包含算术类型、空类型与空指针类型,不同编译模型下的类型长度存在明确标准:LP64模型(64位Linux、macOS)中long类型占8字节,LLP64模型(64位Windows)中long类型占4字节,所有64位环境下指针类型均占8字节,编码时若需要固定长度的整型,应优先使用<cstdint>中定义的int32_t、int64_t等类型,避免跨平台兼容性问题。类型转换包含隐式转换与显式转换两类,隐式转换遵循算术提升规则,即低精度类型向高精度类型、有符号类型向无符号类型自动转换,其中无符号与有符号类型混合运算时易出现逻辑错误(例如负数与无符号数比较会被转换为极大的无符号值);显式转换优先使用C++风格的类型运算符:static_cast用于良性转换(基本类型互转、继承体系的上行转换),无运行时检查;dynamic_cast用于多态类型的下行转换,依赖运行时类型信息(RTTI)完成安全检查,指针转换失败返回nullptr,引用转换失败抛出std::bad_cast异常;const_cast用于去除变量的底层const属性,仅当原对象本身为非常量时修改行为才合法,若修改原先是常量的对象会触发未定义行为;reinterpret_cast用于指针、整数之间的底层位重解释,转换风险极高,仅在底层开发场景谨慎使用。流程控制语句中需要注意:switch-case的判断表达式必须为整型或枚举类型,case标签必须为编译期常量,未添加break时会触发case穿透(fallthrough);goto语句不能跨越非平凡初始化的变量作用域,否则会触发编译错误。第二,函数机制。C++函数支持声明与定义分离,头文件存放函数声明,源文件存放函数实现,可通过inline关键字建议编译器在调用点展开函数,inline函数需要在所有使用它的翻译单元中可见,因此通常放在头文件中,不会触发重复定义错误。函数重载规则要求同一作用域下函数名相同但参数列表存在本质差异(参数个数、类型、顺序不同),返回值类型不参与重载决议;需要特别区分顶层const与底层const对重载的影响:参数的顶层const(修饰参数本身的const)不构成重载差异,例如voidfunc(int)与voidfunc(constint)属于重复定义;参数的底层const(修饰指针或引用指向的对象的const)可构成合法重载,例如voidfunc(int*)与voidfunc(constint*)属于有效重载。默认参数必须从参数列表最右侧连续声明,在函数首次声明位置指定,定义处不得重复指定默认值。函数递归设计必须包含明确的递归终止条件(递归基),且每次递归调用需向终止条件逼近,避免无限制递归导致栈空间耗尽。当数组作为函数参数传递时,会自动退化为指向数组首元素的指针,丢失数组长度信息,因此需要额外传递长度参数或使用模板推导数组长度。第三,面向对象核心机制。类通过访问控制符public、protected、private实现封装,class定义的类默认成员访问权限为private,struct定义的类默认访问权限为public。构造函数负责对象初始化,无返回值,支持重载,const成员、引用成员、无默认构造的成员对象必须在构造函数初始化列表中完成初始化,初始化列表的执行效率高于构造函数体内赋值(后者会先调用成员的默认构造函数再执行赋值操作)。拷贝构造函数的参数为本类的const左值引用,若未自定义,编译器会生成逐成员拷贝的默认版本,在用已有对象初始化新对象、函数按值传参、函数按值返回对象时会触发拷贝构造调用。C++11之后引入移动语义,移动构造函数接收本类的右值引用,通过转移资源所有权避免不必要的深拷贝开销,大幅提升程序性能。类的析构函数在对象生命周期结束时自动调用,负责释放资源,若类需要手动管理动态内存、文件句柄等资源,需遵循C++的“五法则”:若自定义了析构函数、拷贝构造函数、拷贝赋值运算符中的任意一个,通常需要同时实现移动构造函数、移动赋值运算符,保证资源管理的正确性。继承机制支持代码复用,public、protected、private三种继承方式会改变基类成员在派生类中的访问权限,派生类构造时会先调用基类构造函数,再初始化自身成员;菱形继承场景下需要使用虚继承,保证公共基类子对象在最终派生类中仅存在一份副本,避免二义性。多态分为静多态与动多态:静多态在编译期确定调用版本,包括函数重载、模板实例化;动多态在运行期确定调用版本,通过虚函数实现,基类声明虚函数后,派生类重写虚函数时,基类指针或引用指向派生类对象时会自动调用派生类的实现版本,基类的析构函数必须声明为虚函数,否则通过基类指针delete派生类对象时会触发未定义行为。包含纯虚函数的类为抽象类,无法实例化,通常作为接口定义使用,C++11中可使用override关键字显式标记虚函数重写,避免因函数签名不匹配导致重写失效。第四,泛型编程与STL。模板是C++泛型编程的基础,分为函数模板与类模板,编译器在编译期根据传入的模板参数实例化具体的类型代码,模板参数可以是类型参数、编译期常量非类型参数、模板模板参数。STL包含六大核心组件:一是容器,分为序列式容器(vector动态数组、deque双端队列、list双向链表、array静态数组、forward_list单向链表)、关联式容器(set、multiset、map、multimap,基于红黑树实现,元素有序)、无序关联式容器(unordered_set、unordered_map等,基于哈希表实现,平均O(1)时间查找);二是算法,包括排序、查找、遍历、拷贝、变换等通用算法,通过迭代器与容器解耦,不依赖具体容器实现,例如std::sort基于内省排序实现,时间复杂度O(nlogn),要求迭代器支持随机访问,因此list容器需要使用自身的sort成员函数完成排序;三是迭代器,作为容器与算法之间的桥梁,分为输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器五类;四是仿函数,即重载了函数调用运算符operator()的类对象,可作为算法的策略参数;五是适配器,包括容器适配器(stack、queue、priority_queue,基于底层容器封装特定接口)、迭代器适配器、函数适配器(std::bind等);六是空间配置器,负责内存的分配与回收。使用STL容器时需要特别注意迭代器失效问题:vector扩容时所有迭代器、指针、引用全部失效,插入删除点后的迭代器失效;list插入删除操作仅使被删除元素的迭代器失效,其余迭代器不受影响。第五,内存管理。C++程序内存分为五个区域:栈区由编译器自动分配释放,存储局部变量、函数参数、返回地址,空间连续但容量有限(通常为1~8MB);堆区由程序员手动管理,通过new/delete分配释放,空间大且不连续,分配灵活但易出现内存泄漏、野指针问题;全局/静态存储区存储全局变量、静态变量,程序启动时分配,退出时释放;常量存储区存储字符串常量、const全局常量,内存只读;代码区存储程序执行的二进制指令,只读。new/delete与malloc/free存在本质差异:new/delete是C++运算符,分配内存时会调用对象构造函数,释放时调用析构函数,返回对应类型的指针,分配失败默认抛出std::bad_alloc异常;malloc/free是C标准库函数,仅分配和释放原始内存,不调用构造与析构函数,需要手动指定分配大小,返回void*指针,分配失败返回NULL;new[]与delete[]必须配对使用,否则对于非平凡类型会因析构函数调用不全导致内存泄漏。C++11引入基于RAII机制的智能指针实现自动内存管理:std::unique_ptr实现独占式资源所有权,不可拷贝仅可移动,开销与裸指针一致;std::shared_ptr通过引用计数实现共享所有权,最后一个持有对象的shared_ptr销毁时自动释放资源,需要注意循环引用问题(两个对象互相持有对方的shared_ptr会导致引用计数永远无法归零);std::weak_ptr不持有资源所有权,指向shared_ptr管理的对象,可用于探测对象存活状态、解决循环引用问题。核心知识点掌握后,需通过系统化习题训练巩固理解,以下为分题型精选习题及答案解析:一、单项选择题(共10题)1.下列关于C++四种类型转换运算符的描述,正确的是()A.static_cast可以用于将多态基类指针转换为派生类指针,且具备运行时安全检查B.dynamic_cast只能用于含有虚函数的类的指针或引用转换C.const_cast可以用于将常量字符串的const属性去除后修改内容D.reinterpret_cast转换是编译器支持的安全类型转换,无潜在风险答案:B。解析:static_cast完成下行转换时无运行时类型检查,转换存在安全风险;dynamic_cast依赖RTTI实现多态类型检查,仅能用于含虚函数的多态类型;常量字符串存储在只读内存段,即便通过const_cast去除const属性,修改操作会触发内存访问错误,属于未定义行为;reinterpret_cast直接重解释内存位模式,转换风险极高,仅适用于底层开发场景。2.在64位LLP64编译模型(Windows64位默认)下,下列数据类型占用内存大小错误的是()A.int:4字节B.long:4字节C.longlong:8字节D.指针类型:4字节答案:D。解析:所有64位编译模型下,指针类型存储的是64位内存地址,固定占用8字节。3.下列关于C++函数重载的描述,符合语法规则的是()A.两个函数名相同,参数列表完全一致,仅返回值类型不同,可以构成合法重载B.voidfunc(inta)和voidfunc(constinta)是两个合法的重载函数C.voidfunc(int*p)和voidfunc(constint*p)是两个合法的重载函数D.重载函数的默认参数不同即可构成合法重载,与参数列表无关答案:C。解析:返回值类型不参与重载决议;参数的顶层const不构成类型差异,voidfunc(int)与voidfunc(constint)参数类型完全一致,属于重复定义;参数的底层const构成类型差异,int*与constint*是不同类型,可构成合法重载;默认参数不改变参数列表的类型构成,无法作为重载的判定依据。4.下列关于类构造函数的描述,错误的是()A.构造函数没有返回值类型,因此可以用void声明构造函数B.类的const成员变量必须在构造函数初始化列表中完成初始化C.如果一个类没有定义任何构造函数,编译器会自动生成一个无参默认构造函数D.拷贝构造函数的参数必须是本类对象的const左值引用类型答案:A。解析:构造函数无返回值,不得添加任何返回值类型声明(包括void);const成员与引用成员无法在构造函数体内赋值,必须在初始化列表中初始化;拷贝构造函数如果采用值传递参数,会触发无限递归调用,因此参数必须是左值引用类型。5.下列关于C++虚函数与多态的描述,正确的是()A.构造函数可以声明为虚函数B.基类中声明为虚函数的成员,在派生类中重写时必须加virtual关键字才能触发多态C.如果基类的析构函数不是虚函数,通过基类指针delete派生类对象会产生未定义行为D.静态成员函数可以声明为虚函数答案:C。解析:构造函数执行时对象的虚表指针尚未初始化,无法声明为虚函数;派生类重写基类虚函数时,只要函数签名与基类匹配,即便不写virtual关键字也会被识别为虚函数,C++11推荐使用override关键字显式标记重写;静态成员函数属于类而非对象实例,没有this指针,无法通过虚表调度,不能声明为虚函数。6.下列关于new/delete与malloc/free的描述,错误的是()A.new在分配内存失败时默认抛出std::bad_alloc异常,malloc分配失败返回NULLB.new会调用对象的构造函数,malloc仅分配原始内存C.对于int*p=newint[10];可以使用deletep;正确释放内存,不会产生问题D.delete会调用对象的析构函数,free仅释放内存答案:C。解析:new[]分配的数组内存必须使用delete[]释放,否则即便对于int这类平凡类型在部分编译器下未触发崩溃,也属于标准定义的未定义行为,对于含自定义析构函数的非平凡类型,会导致析构函数调用不全,产生内存泄漏。7.下列STL容器中,迭代器属于随机访问迭代器,支持O(1)时间按下标访问元素的是()A.std::list<int>B.std::vector<int>C.std::set<int>D.std::map<int,int>答案:B。解析:list是双向链表,迭代器为双向迭代器,仅支持++、--操作;set、map基于红黑树实现,迭代器为双向迭代器;vector是动态数组,迭代器为随机访问迭代器,支持下标访问、随机偏移。8.下列关于C++智能指针的描述,正确的是()A.std::unique_ptr支持拷贝构造和拷贝赋值,可以多个unique_ptr指向同一块内存B.std::shared_ptr通过引用计数机制管理内存,不会出现任何内存泄漏问题C.std::weak_ptr不增加对象的引用计数,可以用于解决shared_ptr的循环引用问题D.智能指针管理的内存不需要手动释放,因此可以随意将裸指针绑定到多个shared_ptr上答案:C。解析:unique_ptr实现独占所有权语义,禁止拷贝操作,仅支持移动语义;shared_ptr在出现循环引用时,引用计数无法归零,会产生内存泄漏;将同一块裸指针绑定到多个独立的shared_ptr上,会导致引用计数不共享,最终触发重复释放的未定义行为。9.下列关于switch-case语句的描述,符合C++语法规则的是()A.switch后的表达式可以是std::string类型B.case标签后的值可以是程序运行时输入的整型变量C.如果case分支后没有写break语句,会顺序执行后续的case分支代码(fallthrough)D.switch语句必须包含default分支答案:C。解析:switch后的表达式必须可隐式转换为整型或枚举类型,string是类类型,无法作为switch判断表达式;case标签必须是编译期常量表达式,不能是运行期变量;default分支是可选的,不强制要求编写。10.下列关于继承的描述,错误的是()A.public继承方式下,基类的public成员在派生类中仍然是public权限B.菱形继承场景下,使用虚继承可以保证公共基类子对象在派生类中只有一份副本C.派生类的构造函数会先调用基类的构造函数,再初始化自身的成员D.private继承方式下,基类的protected成员在派生类中是public权限答案:D。解析:private继承时,基类的public、protected成员在派生类中均为private权限,派生类对象无法在类外访问这些成员。二、程序阅读题(共5题,写出程序的运行输出结果)1.代码如下:```cppusingnamespacestd;classBase{public:Base(){cout<<"Base构造,";}virtual~Base(){cout<<"Base析构,";}virtualvoidshow(){cout<<"Base::show,";}};classDerived:publicBase{public:Derived(){cout<<"Derived构造,";}~Derived(){cout<<"Derived析构,";}voidshow()override{cout<<"Derived::show,";}};intmain(){Base*p=newDerived();p->show();deletep;return0;}```答案:Base构造,Derived构造,Derived::show,Derived析构,Base析构,。解析:对象构造顺序严格遵循先基类后派生类的规则;基类指针指向派生类对象时,虚函数调用触发动多态,执行派生类重写的show方法;基类析构函数为虚函数,delete时会先调用派生类析构函数,再调用基类析构函数,析构顺序与构造顺序相反。2.代码如下:```cppusingnamespacestd;voidfunc(int&a){cout<<"左值引用,";}voidfunc(int&&a){cout<<"右值引用,";}intmain(){intx=10;func(x);func(20);func(move(x));return0;}```答案:左值引用,右值引用,右值引用,。解析:具名变量x为左值,匹配参数为左值引用的重载版本;字面量20为纯右值,匹配右值引用重载版本;std::move的作用是将左值强制转换为亡值(右值类别),因此匹配右值引用重载版本。3.代码如下:```cppusingnamespacestd;intmain(){intarr[]={1,2,3,4,5};int*p=arr;cout<<*p++<<",";cout<<++*p<<",";cout<<*p++<<",";cout<<*++p<<",";for(inti=0;i<5;i++)cout<<arr[i];return0;}```答案:1,3,3,4,13345。解析:运算符优先级规则中,后置++优先级高于解引用*,前置++与解引用*优先级相同,遵循右结合规则。第一步*p++取arr[0]的值1输出,p后移至arr[1];第二步++*p右结合为++(*p),将arr[1]的值从2自增为3并输出,p位置不变;第三步*p++取arr[1]的当前值3输出,p后移至arr[2];第四步*++p右结合为*(++p),p先移动到arr[3],取arr[3]的值4输出。最终数组元素为1、3、3、4、5,顺序输出为13345。4.代码如下:```cppusingnamespacestd;classA{public:staticintcount;A(){count++;}A(constA&other){count++;}~A(){count--;}};intA::count=0;Afunc(){Aa;returna;}intmain(){Aa=func();cout<<A::count<<endl;return0;}```答案:1。解析:C++17标准强制要求纯右值场景下的拷贝消除,函数返回局部对象时,编译器会直接在调用方的内存空间构造对象,消除两次拷贝构造(返回值拷贝、初始化main中a的拷贝),整个流程仅调用一次默认构造函数,count自增为1;cout输出在main中的a析构之前执行,因此结果为1。5.代码如下:```cppusingnamespacestd;intmain(){vector<int>v{1,2,3};v.reserve(6);cout<<v.size()<<","<<v.capacity()<<",";v.push_back(4);v.pop_back();cout<<v.size()<<","<<v.capacity()<<",";v.shrink_to_fit();cout<<v.size()<<","<<v.capacity();return0;}```答案:3,6,3,6,3,3。解析:初始化v时包含3个元素,reserve(6)预分配6个元素的容量但不改变元素个数,因此size为3、capacity为6;push_back添加元素后size变为4,pop_back删除尾元素后size变回3,pop_back操作不会改变容器预分配的capacity;shrink_to_fit()请求容器将capacity缩减为与当前size匹配的大小,因此最后size与capacity均为3。三、编程实操题(共3题)1.题目:输入一个正整数n(1≤n≤1000),输出1到n之间所有的完数。完数定义为一个正整数恰好等于其所有真因子(除自身外的正约数)之和,例如6=1+2+3、28=1+2+4+7+14均为完数。思路:遍历2到n的所有正整数,对每个数计算所有真因子的累加和,若累加和与数本身相等则判定为完数。由于1是所有大于1的正整数的真因子,可直接初始化sum为1,再遍历2到num/2的范围寻找真因子,避免重复计算。参考代码:```cppusingnamespacestd;intmain(){intn;cin>>n;for(intnum=2;num<=n;num++){intsum=1;for(inti=2;i<=num/2;i++){if(num%i==0)sum+=i;}if(sum==num)cout<<num<<"";}return0;}```输入1000时,程序输出628496,为1000以内的全部完数,结果正确。2.题目:设计Shape抽象基类,包含纯虚函数calcArea()计算面积、calcPerim()计算周长;派生出Circle类(属性为半径radius)、Rectangle类(属性为宽width、高height),两个派生类重写上述纯虚函数;编写通用函数printShapeInfo,接收Shape类型的const引用,输出对应形状的面积与周长(π取3.14159)。思路:抽象基类声明纯虚函数定义统一接口,为基类添加虚析构函数保证派生类资源正确释放;派生类通过构造函数初始化自身属性,重写虚函数实现具体的面积、周长计算逻辑;通用函数通过基类引用触发动多态,无需关心具体形状类型即可完成信息输出。参考代码:```cppusingnamespacestd;constdoublePI=3.14159;classShape{public:virtualdoublecalcArea()const=0;virtualdoublecalcPerim()const=0;virtual~Shape()=default;};classCircle:publicShape{private:doubleradius;public:Circle(doubler):radius(r){}doublecalcArea()constoverride{returnPI*radius*radius;}doublecalcPer
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年福建省厦门大学物理科学与技术学院行政秘书招聘笔试备考题库及答案解析
- 2027年汉中洋县实验学校教师招聘笔试备考试题及答案解析
- 2026福建龙岩二幼(东城园区)招聘炊事员1人笔试模拟试题及答案解析
- 2026年合肥蜀山区公立幼儿园食堂工作人员岗位招聘考试模拟试题及答案解析
- 单县过年超市活动方案策划(3篇)
- 大棚加固横梁施工方案(3篇)
- lng工厂应急预案范文(3篇)
- 工厂应急水塔施工方案(3篇)
- 施工应急预案如何实施(3篇)
- 对公营销费用方案(3篇)
- 对于产品质量投诉的整改回复函7篇
- 智能硬件开发团队测试验证与质量控制手册
- 2026年县级国有粮食储备公司招聘笔试试题(含答案)
- 2.1《各种各样的工具》教学设计2026-2027学年科学五年级上册新教科版
- 2026幼小衔接比大小、填符号口算专项训练(可打印)
- 中老年肌少症筛查与诊疗临床指南(2026版)
- 人教版英语中考高频词汇例句版
- 关于补充耕地实施方案
- 第20课-从“战时共产主义”到“斯大林模式”-初中-历史-教学设计
- 财政非税收入培训课件
- 铁道车辆构造与检修教学课件-单元二-铁道车辆检修基本知识
评论
0/150
提交评论