版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年C++软件开发工程师笔试题及答案一、基础语法与特性1.分析以下代码的输出结果,并说明原因。```cppinclude<iostream>usingnamespacestd;intmain(){inta=5;intp1=&a;constintp2=p1;intconstp3=p1;constintconstp4=p1;//问题1:p1=6;是否合法?//问题2:p2=6;是否合法?//问题3:p3=&a;是否合法?(假设a地址未变)//问题4:p4=6;是否合法?}```答案:问题1合法。p1是普通指针,可修改指向的值。问题2不合法。p2是指向const的指针(常量指针),禁止通过p2修改指向的值,但p2自身可指向其他地址。问题3不合法。p3是指针常量(常指针),指针自身地址不可修改,但可通过p3修改指向的值(如p3=6合法)。问题4不合法。p4是指向const的指针常量,既不可修改指针地址,也不可通过指针修改指向的值。2.说明static关键字在C++中的三种典型用途,并举例说明。答案:(1)全局/局部静态变量:延长生命周期至程序结束,局部静态变量仅初始化一次。例如:```cppvoidfunc(){staticintcount=0;//仅首次调用时初始化count++;cout<<count<<endl;//输出1、2、3...}```(2)类静态成员变量:属于类而非对象,所有对象共享同一实例,需在类外初始化。例如:```cppclassA{public:staticintx;//声明};intA::x=10;//定义并初始化```(3)类静态成员函数:不依赖对象实例,只能访问静态成员(包括静态成员变量和静态成员函数)。例如:```cppclassB{staticinty;public:staticvoidprintY(){cout<<y<<endl;}//合法voidprintNonStatic(){cout<<z<<endl;}//非法(z为非静态成员)};```3.计算以下结构体的sizeof值(假设编译器默认对齐为8字节):```cppstructExample{chara;//1字节intb;//4字节doublec;//8字节shortd;//2字节};```答案:24字节。对齐规则:每个成员的起始地址需是其类型大小的整数倍,结构体总大小需是最大成员(double,8字节)的整数倍。-chara(1字节):偏移0。-intb(4字节):需从偏移4开始(0+1=1,填充3字节至偏移4),占用4~7。-doublec(8字节):偏移8,占用8~15。-shortd(2字节):偏移16,占用16~17。总大小需填充至8的倍数(17+1=18→24),因此sizeof(Example)=24。二、面向对象编程4.简述虚函数表(vtable)的作用及多态的实现机制。答案:虚函数表是类的静态成员,每个包含虚函数的类提供一个vtable,存储该类虚函数的函数指针。类的对象中隐含一个虚表指针(vptr),指向所属类的vtable。当通过基类指针/引用调用虚函数时,运行时通过vptr找到实际对象的vtable,调用对应派生类的函数实现,从而实现动态多态。5.分析以下代码的输出结果:```cppinclude<iostream>usingnamespacestd;classBase{public:Base(){cout<<"Base构造"<<endl;}virtual~Base(){cout<<"Base析构"<<endl;}virtualvoidfunc(){cout<<"Base::func"<<endl;}};classDerived:publicBase{public:Derived(){cout<<"Derived构造"<<endl;}~Derived(){cout<<"Derived析构"<<endl;}voidfunc()override{cout<<"Derived::func"<<endl;}};intmain(){Basep=newDerived();p->func();deletep;return0;}```答案:输出顺序:Base构造→Derived构造→Derived::func→Derived析构→Base析构。原因:创建Derived对象时,先调用基类Base构造函数,再调用Derived构造函数。通过基类指针调用虚函数func()时,动态绑定到Derived的实现。delete基类指针时,由于基类析构函数是虚函数,会先调用Derived析构函数(释放派生类资源),再调用Base析构函数,避免内存泄漏。6.什么是菱形继承?如何解决其带来的问题?答案:菱形继承指派生类同时继承两个共享同一基类的派生类,导致基类成员在派生类中出现多份拷贝。例如:```cppclassA{};classB:publicA{};classC:publicA{};classD:publicB,publicC{};//D中包含两份A的成员```解决方法是使用虚继承(virtualinheritance),使B和C虚继承A,此时D中仅保留一份A的实例。修改为:```cppclassB:virtualpublicA{};classC:virtualpublicA{};```三、内存管理与智能指针7.说明new/delete与malloc/free的区别(至少4点)。答案:(1)类型:new/delete是运算符(可重载),malloc/free是标准库函数。(2)内存分配:new自动计算对象大小并调用构造函数,delete调用析构函数后释放内存;malloc仅分配指定字节的内存(需手动计算大小),free仅释放内存。(3)返回值:new返回对象类型指针(无需强制转换),malloc返回void(需显式转换)。(4)异常处理:new分配失败抛bad_alloc异常,malloc返回NULL(需检查)。(5)自定义内存管理:new/delete可通过重载实现自定义内存池,malloc/free无法重载。8.分析以下代码的内存问题,并给出修正方案。```cppinclude<memory>usingnamespacestd;classNode{public:shared_ptr<Node>next;};intmain(){shared_ptr<Node>a=make_shared<Node>();shared_ptr<Node>b=make_shared<Node>();a->next=b;b->next=a;//问题在此处return0;}```答案:代码存在循环引用,导致a和b的引用计数无法降至0,内存泄漏。原因:a持有b的shared_ptr(b引用计数+1),b持有a的shared_ptr(a引用计数+1)。当main函数结束时,a和b的局部变量销毁,各自引用计数减1,但此时a的引用计数为1(被b->next持有),b的引用计数也为1(被a->next持有),无法触发析构。修正方案:将其中一个指针改为weak_ptr(弱引用,不增加引用计数)。例如:```cppclassNode{public:weak_ptr<Node>next;//修改为weak_ptr};```9.实现一个简单的scoped_ptr(类似unique_ptr的非拷贝版本),要求支持指针解引用、->操作符,且禁止拷贝构造和拷贝赋值。答案:```cpptemplate<typenameT>classscoped_ptr{private:Tptr;scoped_ptr(constscoped_ptr&)=delete;//禁止拷贝构造scoped_ptr&operator=(constscoped_ptr&)=delete;//禁止拷贝赋值public:explicitscoped_ptr(Tp=nullptr):ptr(p){}~scoped_ptr(){deleteptr;}T&operator()const{returnptr;}Toperator->()const{returnptr;}Tget()const{returnptr;}voidreset(Tp=nullptr){if(ptr)deleteptr;ptr=p;}};```四、STL与算法10.比较vector、list、deque三种容器的特性(从插入删除效率、随机访问、内存布局角度)。答案:(1)vector:连续内存数组,支持O(1)随机访问;尾部插入/删除O(1)(扩容时O(n)),中间/头部插入删除O(n)(需移动元素)。(2)list:双向链表,内存不连续;任意位置插入/删除O(1)(无需移动元素),不支持随机访问(需遍历)。(3)deque:双端队列,由多个连续内存块组成(类似动态数组的数组);支持O(1)头部/尾部插入删除(无扩容时),随机访问O(1)(但比vector慢),中间插入删除O(n)。11.编写代码:使用STL算法将vector<int>中的偶数元素筛选出来,并按降序排序。答案:```cppinclude<vector>include<algorithm>include<iterator>usingnamespacestd;vector<int>filter_and_sort(constvector<int>&vec){vector<int>even;//筛选偶数copy_if(vec.begin(),vec.end(),back_inserter(even),[](intx){returnx%2==0;});//降序排序sort(even.begin(),even.end(),greater<int>());returneven;}```12.解释迭代器失效的概念,并举例说明vector和list在插入元素时迭代器失效的情况。答案:迭代器失效指因容器结构改变(如插入、删除元素),导致原有迭代器指向的内存无效或位置错误。-vector:插入元素时,若触发扩容(重新分配内存),所有迭代器(包括begin()、end())失效;若未扩容,插入位置之后的迭代器失效(前面的迭代器仍有效)。例如:```cppvector<int>v={1,2,3};autoit=v.begin();v.insert(it+1,4);//未扩容时,it仍指向1,但it+1及之后的迭代器失效(原2的位置变为4,原3的位置后移)```-list:插入元素不会导致其他迭代器失效(链表节点内存不连续,插入新节点不影响原有节点的地址)。例如:```cpplist<int>l={1,2,3};autoit=l.begin();l.insert(it,4);//it仍指向原1的位置,其他迭代器均有效```五、多线程与并发13.编写代码:使用C++11的thread、mutex和condition_variable实现一个线程安全的有界队列(容量为N),支持push和pop操作。答案:```cppinclude<thread>include<mutex>include<condition_variable>include<queue>template<typenameT>classBoundedQueue{private:queue<T>q;mutexmtx;condition_variablenot_full,not_empty;size_tcapacity;public:BoundedQueue(size_tcap):capacity(cap){}voidpush(constT&val){unique_lock<mutex>lock(mtx);not_full.wait(lock,[this](){returnq.size()<capacity;});//等待队列不满q.push(val);not_empty.notify_one();//通知消费者队列非空}Tpop(){unique_lock<mutex>lock(mtx);not_empty.wait(lock,[this](){return!q.empty();});//等待队列非空Tval=q.front();q.pop();not_full.notify_one();//通知生产者队列非满returnval;}};```14.简述死锁发生的四个必要条件及避免方法。答案:四个必要条件:(1)互斥:资源同一时间只能被一个线程占用。(2)请求与保持:线程持有至少一个资源并请求其他资源。(3)不可抢占:已获得的资源无法被强制剥夺。(4)循环等待:线程间形成资源的环形等待链。避免方法:-破坏请求与保持:一次性申请所有需要的资源(原子化申请)。-破坏不可抢占:设计资源释放机制(如超时释放锁)。-破坏循环等待:对资源按固定顺序申请(如按资源ID从小到大加锁)。六、算法与数据结构15.编写函数反转单链表(要求递归和迭代两种实现)。答案:迭代实现:```cppstructListNode{intval;ListNodenext;ListNode(intx):val(x),next(nullptr){}};ListNodereverseList_iter(ListNodehead){ListNodeprev=nullptr;ListNodecurr=head;while(curr){ListNodenext=curr->next;//保存下一节点curr->next=prev;//反转指针prev=curr;//移动prevcurr=next;//移动curr}returnprev;//新头节点是原尾节点}```递归实现:```cppListNodereverseList_recur(ListNodehead){if(!head||!head->next)returnhead;//空或单节点直接返回ListNodenewHead=reverseList_recur(head->next);//递归反转后续节点head->next->next=head;//反转当前节点与下一个节点的指针head->next=nullptr;//原头节点变为尾节点,next置空returnnewHead;}```16.给定一个未排序的整数数组,找出最长连续序列的长度(时间复杂度要求O(n))。示例:输入[100,4,200,1,3,2],输出4(序列1,2,3,4)。答案:使用哈希表记录元素是否存在,遍历每个元素时向左右扩展,统计连续长度。```cppinclude<unordered_set>usingnamespacestd;intlongestConsecutive(vector<int>&nums){unordered_set<int>s(nums.begin(),nums.end());intmax_len=0;for(intnum:nums){if(s.find(num-1)==s.end()){//仅处理序列起点intcurrent=num;intlen=1;while(s.find(current+1)!=s.end()){current++;len++;}max_len=max(max_len,len);}}returnmax_len;}```七、设计模式17.实现线程安全的懒汉式单例模式(要求使用C++11特性,避免内存泄漏)。答案:使用局部静态变量(C++11保证线程安全):```cppclassSingleton{private:Singleton()=default;//私有构造函数~Singleton()=default;Singleton(constSingleton&)=delete;Singleton&operator=(constSingleton&)=delete;public:staticSingleton&getInstance(){staticSingletoninstance;//C++11起,局部静态变量初始化线程安全returninstance;}};```或使用双重检查锁定(需配合内存屏障):```cppclassSingleton{private:staticSingletoninstance;staticmutexmtx;Singleton()=default;public:staticSingletongetInstance(){if(!instance){//第一次检查(减少锁竞争)lock_guard<mutex>lock(mtx);if(!instance){//第二次检查(避免多线程重复创建)instance=newSingleton();}}returninstance;}};SingletonSingleton::instance=nullptr;mutexSingleton::mtx;```18.设计一个观察者模式,实现气象站(Subject)通知多个显示器(Observer)更新天气数据(温度、湿度、气压)。答案:```cppinclude<vector>include<algorithm>classObserver{public:virtualvoidupdate(floattemp,floathumidity,floatpressure)=0;virtual~Observer()=default;};classSubject{public:virtualvoidregisterObserver(Observero)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 团队待办清单
- 项目部机关工作清单设计框架模板
- 广东省广州市越秀区2019-2020学年七年级下学期期末历史试题(含答案)
- 膀胱癌患者的饮食调理
- 精-品解析:【全国省级联考】2024年北师版七年级下册数学期末模拟测试试卷(解析版)
- 衢州市2025-2026学年高三第六次模拟考试语文试卷含解析
- 26年基础护理风险防控课件
- 四川省遂宁市射洪中学2025-2026学年高一下学期期中考试地理试卷
- 【X市乡村治理“三治”融合体系建设现状及完善对策开题报告文献综述7400字】
- 【2025】遵义市湄潭县卫生健康局招聘事业单位聘用人员考试真题
- 国家职业技术技能标准 4-14-03-01 助听器验配师 人社厅发202051号
- 职技理论考试民航乘务员考试题库及答案
- 盘扣式卸料平台施工方案
- DB22∕T 2769-2017 公路隧道无机阻燃温拌沥青路面施工技术指南
- 沉香树病虫害的防治
- 《无机化学》-氮族元素习题
- 大学生心理健康教育第9章课件
- 石家庄市国企招聘考试真题及答案
- 第十二章疾病的分子生物学
- 安庆石化110kV输变电工程 环评报告表
- 软件企业专项审计报告范本
评论
0/150
提交评论