版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
2025年CC++中興筆試題目及答案(軟件開發(fā)工程師)一、單項選擇題(每題2分,共20分)1.以下關于C++虛函數表的描述,錯誤的是()A.每個含有虛函數的類都會提供一個虛函數表B.虛函數表在編譯期提供,程序運行時地址固定C.多繼承時,派生類的虛函數表會包含所有基類虛函數的入口D.虛表指針(vptr)在對象構造函數的函數體內被初始化答案:D解析:虛表指針的初始化發(fā)生在構造函數的初始化列表階段之后、函數體執(zhí)行之前。若在構造函數體內修改虛函數行為(如調用虛函數),實際調用的是當前類的版本,而非派生類的重寫版本。2.以下代碼執(zhí)行后,輸出結果為()```cppinclude<iostream>usingnamespacestd;classA{public:virtualvoidfunc(){cout<<"A::func"<<endl;}};classB:publicA{public:voidfunc(){cout<<"B::func"<<endl;}};intmain(){Aa;Bb;Apa1=&a;Apa2=&b;Bpb=(B)pa1;pb>func();return0;}```A.A::funcB.B::funcC.編譯錯誤D.運行時崩潰答案:A解析:pa1指向A類對象,強制轉換為B后,pb的類型是B,但實際指向的對象是A類實例。調用func時,虛函數表根據實際對象類型(A)查找,因此調用A::func。3.關于C++智能指針,以下說法正確的是()A.unique_ptr不能作為容器的元素,因為無法拷貝B.shared_ptr的引用計數操作是線程安全的,因此多線程中無需加鎖C.weak_ptr可以解決shared_ptr循環(huán)引用導致的內存泄漏問題D.make_shared比直接new更高效,因為只分配一次內存,但無法用于自定義刪除器答案:C解析:weak_ptr不增加引用計數,可打破循環(huán)引用;unique_ptr可通過移動語義存入容器;shared_ptr的引用計數雖線程安全,但對象本身的操作仍需同步;make_shared確實無法直接指定自定義刪除器(需結合shared_ptr的構造函數)。4.以下代碼中,不會導致內存泄漏的是()A.`intp=newint[10];p=nullptr;`B.`std::shared_ptr<int>sp1(newint(5));std::shared_ptr<int>sp2=sp1;`C.`voidp=malloc(100);free(p+1);`D.`charstr=strdup("test");str="new_test";`答案:B解析:A中丟失new分配的內存地址;C中free非malloc返回的指針(p+1)導致未定義行為;D中strdup返回的指針被覆蓋,無法釋放;B中shared_ptr的引用計數為2,離開作用域后自動釋放。5.以下STL容器中,插入元素不會導致迭代器失效的是()A.vectorB.dequeC.listD.unordered_map答案:C解析:list的節(jié)點通過指針連接,插入操作僅修改相鄰節(jié)點的指針,不影響其他迭代器;vector在擴容時迭代器失效;deque在首尾插入可能不失效,但中間插入可能失效;unordered_map在rehash時迭代器失效。6.以下關于操作系統(tǒng)進程與線程的描述,錯誤的是()A.進程是資源分配的基本單位,線程是調度的基本單位B.同一進程內的線程共享堆內存,但擁有獨立的??臻gC.線程的創(chuàng)建開銷小于進程,因為無需復制父進程的地址空間D.多線程程序中,全局變量的訪問不需要加鎖,因為線程共享地址空間答案:D解析:多線程對全局變量的非原子操作(如i++)會引發(fā)競態(tài)條件,必須通過互斥鎖或原子操作保護。7.以下哪種情況不會導致死鎖?()A.進程A持有鎖1,請求鎖2;進程B持有鎖2,請求鎖1B.進程A持有鎖1,請求鎖1(重復加鎖且未實現(xiàn)可重入)C.進程A請求鎖1失敗,釋放已持有的鎖2,重新等待鎖1D.系統(tǒng)資源總量不足,多個進程循環(huán)等待剩余資源答案:C解析:死鎖的四個必要條件包括互斥、不可搶占、請求并保持、循環(huán)等待。C中進程主動釋放已持有的資源(破壞請求并保持條件),因此不會死鎖。8.TCP三次握手過程中,第二次握手的報文中,SYN和ACK標志位的狀態(tài)是()A.SYN=0,ACK=0B.SYN=1,ACK=0C.SYN=0,ACK=1D.SYN=1,ACK=1答案:D解析:第一次握手(C→S):SYN=1,ACK=0;第二次握手(S→C):SYN=1(確認連接請求),ACK=1(確認客戶端的SYN);第三次握手(C→S):SYN=0,ACK=1。9.以下關于C++模板的描述,正確的是()A.模板函數不能被重載B.類模板的成員函數在實例化前不會提供代碼C.模板特化的優(yōu)先級低于模板實例化D.模板參數只能是類型參數,不能是數值參數答案:B解析:類模板的成員函數僅在被調用時實例化;模板函數可以重載;特化的優(yōu)先級高于通用模板;模板參數可以是類型(如template<typenameT>)或非類型(如template<intN>)。10.以下代碼的輸出結果是()```cppinclude<iostream>usingnamespacestd;intmain(){inta=5;intp=&a;cout<<sizeof(p)<<""<<sizeof(p)<<endl;return0;}```(假設運行在64位系統(tǒng),編譯器為GCC)A.44B.84C.48D.88答案:B解析:64位系統(tǒng)中指針大小為8字節(jié),int類型大小為4字節(jié)(多數系統(tǒng)),因此輸出84。二、填空題(每題3分,共15分)1.若要將一個類設計為不可拷貝,可將拷貝構造函數和拷貝賦值運算符聲明為______,并置于______訪問控制符下(C++11前)。答案:delete(或聲明為私有且不定義);private解析:C++11前通過將拷貝構造函數和賦值運算符聲明為private且不實現(xiàn),防止外部拷貝;C++11后可直接使用=delete。2.以下代碼存在一個典型錯誤,該錯誤是______。```cppclassA{public:virtualvoidfunc(){cout<<"A"<<endl;}};classB:publicA{public:voidfunc(intx){cout<<"B"<<endl;}};intmain(){Apa=newB();pa>func();//期望調用B::func(),但實際調用A::func()return0;}```答案:B::func(intx)并未重寫A::func()(參數列表不同,構成重載而非重寫)解析:虛函數重寫要求函數名、參數列表、返回值(協(xié)變情況除外)完全一致。B中的func有一個int參數,與A的無參func構成重載,因此pa>func()調用A的版本。3.若需要統(tǒng)計一個C++程序中動態(tài)分配的內存是否全部釋放,可通過重載______運算符,并配合全局變量計數實現(xiàn)。答案:new(或operatornew)解析:重載全局的operatornew和operatordelete,在分配時增加計數器,釋放時減少,程序結束時檢查計數器是否為0。4.以下代碼執(zhí)行后,輸出結果為______。```cppinclude<iostream>include<vector>usingnamespacestd;intmain(){vector<int>v={1,2,3};autoit=v.begin();v.insert(it,0);cout<<it<<endl;return0;}```答案:1(或未定義行為,但通常輸出1)解析:vector的insert操作可能導致迭代器失效(若擴容)。原it指向v.begin()(即原第一個元素1的位置),插入0后,原元素后移,新的begin()指向0,原it可能指向新的第二個元素(值為1)。但嚴格來說,insert后迭代器是否失效取決于是否擴容:若原容量足夠(如初始容量>=4),則迭代器有效;否則失效。此處初始容量為3,插入后大小變?yōu)?,可能觸發(fā)擴容,導致it失效,輸出未定義。但實際測試中(如GCC),vector初始容量為3,插入后容量變?yōu)?,原迭代器失效,解引用行為未定義。但常見編譯器可能仍輸出1(原元素后移后的位置),需注意此為未定義行為。5.某二叉樹的前序遍歷序列為ABCDE,中序遍歷序列為BADCE,則后序遍歷序列為______。答案:BDECA解析:前序根為A,中序中A左邊是B(左子樹),右邊是DCE(右子樹)。前序左子樹為B(根),中序左子樹B無左子樹,右子樹為空。前序右子樹為CDE,根為C;中序右子樹C左邊是D(左子樹),右邊是E(右子樹)。后序遍歷順序:左(B)→右子樹的左(D)→右子樹的右(E)→右子樹根(C)→根(A),即BDECA。三、編程題(每題15分,共45分)1.題目:給定一個字符串s和一個正整數k,找出s中長度至少為k的最長子串,使得該子串中的每個字符出現(xiàn)次數都不超過k。若有多個符合條件的子串,返回最長的那個;若長度相同,返回字典序最小的。示例:輸入:s="aababc",k=2輸出:"abab"(解釋:子串"abab"長度為4,每個字符a出現(xiàn)2次,b出現(xiàn)2次,均≤k=2;其他可能子串如"aab"長度3,"ababc"中c出現(xiàn)1次但b出現(xiàn)3次,不符合)要求:時間復雜度O(n)或O(nC)(C為字符集大?。=忸}思路:滑動窗口法。維護左右指針left和right,記錄窗口內各字符的計數。當窗口中存在字符計數超過k時,移動左指針縮小窗口;否則擴展右指針。同時記錄滿足條件的最長子串(需處理長度相同字典序最小的情況)。代碼實現(xiàn):```cppinclude<string>include<unordered_map>usingnamespacestd;stringlongestSubstringWithLimit(conststring&s,intk){intn=s.size();intmax_len=0;stringres;for(intleft=0,right=0;right<n;++right){unordered_map<char,int>count;intmax_count=0;left=right;//重置左指針,從當前右指針開始擴展for(;right<n;++right){charc=s[right];count[c]++;max_count=max(max_count,count[c]);if(max_count>k){//當前窗口不滿足條件,需移動左指針right;//回退right,避免跳過下一個可能的窗口break;}//更新最長子串intcurrent_len=rightleft+1;if(current_len>max_len||(current_len==max_len&&s.substr(left,current_len)<res)){max_len=current_len;res=s.substr(left,current_len);}}}returnres;}```(注:上述代碼為簡化版,實際優(yōu)化可通過固定窗口最大長度,減少重復計數。更優(yōu)解法是維護全局計數,當出現(xiàn)超量字符時,移動左指針直到所有字符計數≤k。)2.題目:給定一個二叉樹的根節(jié)點,判斷該二叉樹是否為平衡二叉樹。平衡二叉樹的定義是:任意節(jié)點的左右子樹的高度差絕對值不超過1,且左右子樹本身也是平衡二叉樹。要求:遞歸實現(xiàn),時間復雜度O(n)。解題思路:后序遍歷二叉樹,計算每個節(jié)點的左右子樹高度。若左右子樹高度差>1,或左右子樹本身不平衡,則返回1(表示不平衡);否則返回當前節(jié)點的高度(max(left,right)+1)。代碼實現(xiàn):```cppstructTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(intx):val(x),left(nullptr),right(nullptr){}};intcheckBalance(TreeNoderoot){if(!root)return0;intleft_h=checkBalance(root>left);if(left_h==1)return1;//左子樹不平衡intright_h=checkBalance(root>right);if(right_h==1)return1;//右子樹不平衡if(abs(left_hright_h)>1)return1;//當前節(jié)點不平衡returnmax(left_h,right_h)+1;//返回當前高度}boolisBalanced(TreeNoderoot){returncheckBalance(root)!=1;}```3.題目:設計一個LRU(最近最少使用)緩存,支持以下操作:get(key):獲取key對應的值,若不存在返回1,且訪問后更新該key為最近使用。put(key,value):插入或更新鍵值對。若緩存容量已滿,刪除最久未使用的key。要求:使用C++實現(xiàn),時間復雜度O(1)。解題思路:使用雙向鏈表維護訪問順序(最近使用的在頭部),哈希表(unordered_map)存儲key到鏈表節(jié)點的映射。插入時,若key存在則更新值并移動節(jié)點到頭部;若不存在且容量未滿,插入頭部;若容量滿,刪除尾部節(jié)點并從哈希表中移除,再插入新節(jié)點。代碼實現(xiàn):```cppinclude<unordered_map>usingnamespacestd;structNode{intkey,val;Nodeprev;Nodenext;Node(intk,intv):key(k),val(v),prev(nullptr),next(nullptr){}};classLRUCache{private:intcapacity;unordered_map<int,Node>cache;Nodehead;//最近使用Nodetail;//最久未使用voidmoveToHead(Nodenode){if(node==head)return;//斷開原連接Nodeprev=node>prev;Nodenext=node>next;if(prev)prev>next=next;if(next)next>prev=prev;//若node是tail,更新tailif(node==tail)tail=prev;//插入到頭部node>prev=nullptr;node>next=head;if(head)head>prev=node;head=node;//處理空鏈表情況if(!tail)tail=head;}voidaddToHead(Nodenode){node>prev=nullptr;node>next=head;if(head)head>prev=node;head=node;if(!tail)tail=head;//初始時tail為空}voidremoveTail(){if(!tail)return;NodetoDel=tail;cache.erase(toDel>key);if(tail>prev){tail=tail>prev;tail>next=nullptr;}else{//只有一個節(jié)點head=tail=nullptr;}deletetoDel;}public:LRUCache(intcap):capacity(cap),head(nullptr),tail(nullptr){}intget(intkey){if(!cache.count(key))return1;Nodenode=cache[key];moveToHead(node);returnnode>val;}voidput(intkey,intvalue){if(cache.count(key)){Nodenode=cache[key];node>val=value;moveToHead(node);}else{NodenewNode=newNode(key,value);cache[key]=newNode;addToHead(newNode);if(cache.size()>capacity){removeTail();}}}};```四、綜合題(每題10分,共20分)1.設計一個線程安全的單例模式(C++實現(xiàn)),要求支持延遲初始化,且能避免內存泄漏。解答:使用C++11的局部靜態(tài)變量特性(保證線程安全)或std::call_once。實現(xiàn)方式一(局部靜態(tài)變量):```cppclassSingleton{private:Singleton()=default;~Singleton()=default;Singleton(constSingleton&)=delete;Singleton&operator=(constSingleton&)=delete;public:staticSingleton&getInstance(){staticSingletoninstance;returninstance;}};```解析:C++11規(guī)定,局部靜態(tài)變量的初始化是線程安全的,僅在首次調用時初始化,后續(xù)調用直接返回。析構函數由編譯器自動調用,避免內存泄漏。實現(xiàn)方式二(std::call_once):```cppinclude<mutex>include<atomic>classSingleton{private:staticSingletoninstance;staticstd::once_flagflag;Singleton()=default;~Singleton()=default;Singleton(constSingleton&)=delete;Singleton&operator=(constSingleton&)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全保衛(wèi)制度
- 2026秋招:創(chuàng)維集團筆試題及答案
- 深度解析(2026)《TBT 3572-2022鐵路電力變壓器》
- 深度解析(2026)《TBT 3437-2016線路大修列車》
- 聽課評議制度
- 口腔門診醫(yī)療文書制度
- 小學創(chuàng)客空間設計與改造方案
- 小學閱讀推廣活動空間建設方案
- 標準化廠房景觀綠化設計方案
- 標準化廠房項目總結報告方案
- 2026屆杭州高級中學高二上數學期末聯(lián)考試題含解析
- 2026年陜西氫能產業(yè)發(fā)展有限公司所屬單位社會公開招聘備考題庫及1套參考答案詳解
- 2026年及未來5年中國無取向硅鋼片行業(yè)市場深度分析及發(fā)展趨勢預測報告
- 棄土場規(guī)范規(guī)章制度
- 2026年水下機器人勘探報告及未來五至十年深海資源報告
- 2025年3月29日事業(yè)單位聯(lián)考(職測+綜應)ABCDE類筆試真題及答案解析
- 雙重預防體系建設自評報告模板
- 高血壓教學查房復習過程教案(2025-2026學年)
- 感控PDCA持續(xù)質量改進
- 2025年云服務器采購合同協(xié)議
- 補氣血培訓課件
評論
0/150
提交評論