版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【附答案】CC++最常見50道面試題1.sizeof和strlen的區(qū)別?sizeof是C/C++中的運算符,用于計算數(shù)據(jù)類型或變量在內(nèi)存中占用的字節(jié)數(shù)。其參數(shù)可以是類型名或變量名,編譯時確定結(jié)果(對于非動態(tài)數(shù)組)。對于字符串?dāng)?shù)組,sizeof會計算包括結(jié)束符'\0'在內(nèi)的總長度。strlen是C標(biāo)準(zhǔn)庫函數(shù),用于計算C風(fēng)格字符串的實際長度(不包含'\0'),運行時通過遍歷字符直到遇到'\0'停止。例如,chararr[]="hello";sizeof(arr)結(jié)果為6(包含'\0'),strlen(arr)結(jié)果為5。2.指針和引用的區(qū)別?指針是一個變量,存儲的是另一個變量的內(nèi)存地址,可以為空(nullptr),可以在初始化后重新指向其他對象。引用是對象的別名,必須在初始化時綁定到一個對象,且不能重新綁定到其他對象,也不能為null。指針的大小是內(nèi)存地址的大小(32位系統(tǒng)4字節(jié),64位8字節(jié)),引用的大小與所引用對象相同(但底層實現(xiàn)可能仍是指針)。指針通過解引用訪問對象,引用直接使用變量名訪問。引用比指針更安全,避免空指針和野指針問題,但靈活性較低。3.const的作用?const用于修飾變量、函數(shù)參數(shù)、成員函數(shù)或指針,保證被修飾對象在作用域內(nèi)不可修改。修飾變量時,變量成為常量,必須初始化;修飾指針時,分為常量指針(指針指向的內(nèi)容不可變,如constintp)和指針常量(指針本身不可變,如intconstp);修飾成員函數(shù)時(如voidfunc()const),表示該函數(shù)不會修改類的成員變量(mutable修飾的變量除外);修飾函數(shù)參數(shù)時,防止函數(shù)內(nèi)部修改輸入?yún)?shù)的值,提高代碼安全性。4.static的作用?在全局變量或函數(shù)前使用static,限制其作用域僅在當(dāng)前文件內(nèi)(內(nèi)部鏈接屬性),避免不同文件間的命名沖突。在類成員中使用static,成員變量屬于類而非對象實例,所有對象共享同一副本,需在類外初始化;static成員函數(shù)只能訪問static成員變量或其他static成員函數(shù),不能使用this指針。在局部變量前使用static,延長變量生命周期至程序結(jié)束,但作用域仍為局部,僅初始化一次,后續(xù)調(diào)用保留上次的值。5.內(nèi)聯(lián)函數(shù)和宏的區(qū)別?內(nèi)聯(lián)函數(shù)通過inline關(guān)鍵字聲明,由編譯器處理,在調(diào)用處展開,避免函數(shù)調(diào)用開銷。內(nèi)聯(lián)函數(shù)是真正的函數(shù),會進行類型檢查和作用域解析,安全性高。宏(define)是預(yù)處理器指令,在編譯前進行簡單的文本替換,不進行類型檢查,可能引發(fā)副作用(如defineADD(a,b)a+b,調(diào)用ADD(1+2,34)會展開為1+2+34,結(jié)果與預(yù)期不符)。內(nèi)聯(lián)函數(shù)適用于短且頻繁調(diào)用的函數(shù),宏適用于簡單的常量或表達式替換,但現(xiàn)代C++建議用const和內(nèi)聯(lián)函數(shù)替代宏。6.new/delete和malloc/free的區(qū)別?new是C++運算符,用于動態(tài)分配內(nèi)存并調(diào)用構(gòu)造函數(shù)初始化對象;delete用于釋放內(nèi)存并調(diào)用析構(gòu)函數(shù)。malloc是C庫函數(shù)(需包含<stdlib.h>),僅分配指定大小的內(nèi)存(返回void指針,需強制轉(zhuǎn)換),不執(zhí)行對象初始化;free僅釋放內(nèi)存,不調(diào)用析構(gòu)函數(shù)。new失敗時拋出bad_alloc異常,malloc失敗返回NULL。new可以重載,支持定位new(在指定內(nèi)存地址構(gòu)造對象),malloc無法重載。C++中建議優(yōu)先使用new/delete管理對象,malloc/free用于管理非對象內(nèi)存。7.C++和C的區(qū)別?C是面向過程的語言,主要關(guān)注數(shù)據(jù)操作的步驟;C++是面向?qū)ο蟮恼Z言(支持封裝、繼承、多態(tài)),同時兼容C的特性。C++引入類(class)、對象、模板(template)、異常處理(try/catch)、函數(shù)重載、運算符重載、引用、智能指針等特性。C使用struct定義結(jié)構(gòu)體(僅包含數(shù)據(jù)),C++中struct可包含成員函數(shù),且默認訪問權(quán)限為public(class默認private)。C++支持函數(shù)內(nèi)聯(lián)、默認參數(shù)、lambda表達式等現(xiàn)代編程特性,C不支持。C++的標(biāo)準(zhǔn)庫(如STL)提供更豐富的容器和算法,C依賴標(biāo)準(zhǔn)庫(如stdio.h、stdlib.h)。8.結(jié)構(gòu)體和類的區(qū)別?在C++中,struct和class的主要區(qū)別是默認訪問權(quán)限:struct成員默認public,class默認private。struct可用于定義簡單數(shù)據(jù)結(jié)構(gòu)(如C風(fēng)格結(jié)構(gòu)體),class更強調(diào)面向?qū)ο蟮姆庋b性。struct可以繼承,也可以包含成員函數(shù)、構(gòu)造函數(shù)、析構(gòu)函數(shù)等,與class的語法規(guī)則基本一致。C中struct僅能包含數(shù)據(jù)成員,不能包含函數(shù)。C++中struct的設(shè)計主要是為了兼容C代碼,實際開發(fā)中class更常用。9.友元函數(shù)的作用及注意事項?友元函數(shù)(friend)是在類外部定義的函數(shù),通過在類內(nèi)部聲明friend關(guān)鍵字,獲得訪問該類私有(private)和保護(protected)成員的權(quán)限。友元函數(shù)可以是普通函數(shù),也可以是其他類的成員函數(shù)。友元機制突破了類的封裝性,提高了靈活性(如運算符重載需要訪問私有成員時),但過度使用會破壞類的封裝性,導(dǎo)致代碼耦合度增加。友元關(guān)系不可繼承,也不具有傳遞性(A是B的友元,B是C的友元,A不一定是C的友元)。10.虛函數(shù)和純虛函數(shù)的區(qū)別?虛函數(shù)通過virtual關(guān)鍵字聲明,在基類中定義具體實現(xiàn),派生類可以重寫(override)以實現(xiàn)多態(tài)。純虛函數(shù)是在基類中聲明但未實現(xiàn)的虛函數(shù)(聲明形式為virtualvoidfunc()=0;),包含純虛函數(shù)的類是抽象類,不能實例化,必須由派生類提供具體實現(xiàn)才能實例化。虛函數(shù)用于定義基類的默認行為,允許派生類覆蓋;純虛函數(shù)用于定義接口規(guī)范,強制派生類實現(xiàn)特定功能(如設(shè)計模式中的策略模式)。11.多態(tài)的實現(xiàn)原理?多態(tài)分為靜態(tài)多態(tài)(編譯時多態(tài))和動態(tài)多態(tài)(運行時多態(tài))。靜態(tài)多態(tài)通過函數(shù)重載或模板實現(xiàn),編譯器在編譯階段確定調(diào)用的函數(shù)版本。動態(tài)多態(tài)通過虛函數(shù)實現(xiàn):每個包含虛函數(shù)的類會提供一個虛函數(shù)表(vtable),表中存儲該類所有虛函數(shù)的函數(shù)指針;類的對象內(nèi)存布局中包含一個虛表指針(vptr),指向所屬類的虛函數(shù)表。當(dāng)通過基類指針或引用調(diào)用虛函數(shù)時,運行時根據(jù)對象的實際類型(通過vptr找到對應(yīng)的vtable)調(diào)用正確的函數(shù)版本,實現(xiàn)動態(tài)綁定。12.重載(overload)和重寫(override)的區(qū)別?重載發(fā)生在同一作用域(如同一類中),函數(shù)名相同但參數(shù)列表(類型、個數(shù)、順序)不同,返回類型可以不同。重載是靜態(tài)多態(tài)的體現(xiàn),編譯時通過參數(shù)匹配確定調(diào)用的函數(shù)版本。重寫發(fā)生在繼承體系中,派生類重新定義基類的虛函數(shù),函數(shù)名、參數(shù)列表、返回類型必須完全相同(協(xié)變返回類型除外)。重寫是動態(tài)多態(tài)的體現(xiàn),運行時根據(jù)對象實際類型調(diào)用函數(shù)。重載不要求基類函數(shù)是虛函數(shù),重寫必須是基類虛函數(shù)的覆蓋。13.內(nèi)存泄漏的定義及檢測方法?內(nèi)存泄漏指程序中已分配的堆內(nèi)存未被釋放,且無法再被程序訪問到的情況。長期運行的程序若存在內(nèi)存泄漏,會導(dǎo)致可用內(nèi)存逐漸減少,最終引發(fā)程序崩潰或性能下降。檢測方法包括:使用工具(如Valgrind、Dr.Memory)在運行時跟蹤內(nèi)存分配和釋放;重載new/delete運算符,記錄分配的內(nèi)存地址和調(diào)用棧,程序結(jié)束時檢查未釋放的內(nèi)存;在代碼中添加內(nèi)存泄漏檢測模塊(如通過智能指針自動管理內(nèi)存);觀察任務(wù)管理器中程序內(nèi)存占用是否持續(xù)增長。14.智能指針有哪些?各自的特點?C++標(biāo)準(zhǔn)庫提供三種智能指針:unique_ptr、shared_ptr、weak_ptr(C++11引入)。unique_ptr:獨占所有權(quán)的智能指針,同一時間只能有一個unique_ptr指向某個對象。通過移動語義(move)轉(zhuǎn)移所有權(quán),不可拷貝(拷貝構(gòu)造函數(shù)和賦值運算符被刪除)。適用于管理生命周期明確的資源(如局部對象)。shared_ptr:共享所有權(quán)的智能指針,通過引用計數(shù)(referencecount)管理對象生命周期。多個shared_ptr可指向同一對象,引用計數(shù)為0時自動釋放對象。需注意循環(huán)引用問題(如兩個shared_ptr互相指向?qū)Ψ?,?dǎo)致引用計數(shù)無法歸零)。weak_ptr:弱引用智能指針,不參與引用計數(shù),用于解決shared_ptr的循環(huán)引用問題。weak_ptr可觀測shared_ptr管理的對象,但無法直接訪問,需通過lock()方法獲取shared_ptr(若對象未被釋放)。15.模板的作用及特化?模板(template)是C++泛型編程的基礎(chǔ),允許定義與類型無關(guān)的函數(shù)或類,提高代碼復(fù)用性。函數(shù)模板(如template<typenameT>Tadd(Ta,Tb){returna+b;})和類模板(如vector<T>)可針對不同類型參數(shù)提供具體的函數(shù)或類實例。模板特化用于為特定類型提供定制化實現(xiàn),分為全特化(template<>classMyClass<int>{...})和偏特化(template<typenameT>classMyClass<T>{...},針對指針類型特化)。特化可以優(yōu)化特定類型的性能,或處理無法通用的邏輯(如對bool類型的特殊處理)。16.異常處理的流程?C++異常處理通過try、catch、throw關(guān)鍵字實現(xiàn)。當(dāng)程序發(fā)生錯誤時,使用throw拋出異常對象(如throwstd::runtime_error("error"));在可能拋出異常的代碼塊外使用try包裹,隨后通過catch捕獲異常對象。catch塊按聲明順序匹配異常類型(子類異常需在父類之前捕獲,否則會被父類catch塊攔截)。若異常未被捕獲,程序調(diào)用std::terminate()終止。異常處理需注意資源釋放(如使用RAII或智能指針避免內(nèi)存泄漏),避免在析構(gòu)函數(shù)中拋出異常(可能導(dǎo)致程序崩潰)。17.RTTI的作用及實現(xiàn)機制?RTTI(RunTimeTypeIdentification,運行時類型識別)允許程序在運行時獲取對象的類型信息,主要通過typeid運算符和dynamic_cast運算符實現(xiàn)。typeid返回一個type_info對象,可用于比較類型是否相同(如typeid(obj)==typeid(Base))或獲取類型名稱(typeid(obj).name())。dynamic_cast用于安全地將基類指針或引用轉(zhuǎn)換為派生類類型,若轉(zhuǎn)換失敗(指針返回nullptr,引用拋出bad_cast異常),需基類包含虛函數(shù)(存在虛表)才能使用。RTTI的實現(xiàn)依賴于虛表中存儲的類型信息,編譯器在提供虛表時會插入type_info指針,用于類型識別。18.STL中常用容器的分類及適用場景?STL容器分為序列容器、關(guān)聯(lián)容器和容器適配器。序列容器:元素順序由插入位置決定,包括vector(動態(tài)數(shù)組,隨機訪問,尾部插入/刪除高效)、deque(雙端隊列,頭尾插入/刪除高效)、list(雙向鏈表,任意位置插入/刪除高效,不支持隨機訪問)、forward_list(單向鏈表,C++11引入,空間更節(jié)?。?。關(guān)聯(lián)容器:元素按鍵值排序或哈希存儲,包括set(有序集合,鍵唯一)、multiset(有序集合,鍵可重復(fù))、map(有序鍵值對,鍵唯一)、multimap(有序鍵值對,鍵可重復(fù),基于紅黑樹實現(xiàn));unordered_set、unordered_multiset、unordered_map、unordered_multimap(基于哈希表實現(xiàn),無序,查找平均O(1))。容器適配器:基于現(xiàn)有容器實現(xiàn)特定接口,包括stack(棧,默認基于deque)、queue(隊列,默認基于deque)、priority_queue(優(yōu)先隊列,默認基于vector,最大堆實現(xiàn))。選擇容器時需根據(jù)操作需求(如隨機訪問、插入位置、查找效率)決定。19.vector的擴容機制?vector內(nèi)部使用連續(xù)的內(nèi)存空間存儲元素,當(dāng)插入元素導(dǎo)致容量(capacity)不足時,會觸發(fā)擴容。擴容策略通常為倍增(如當(dāng)前容量為n,擴容后為2n或1.5n,不同編譯器實現(xiàn)不同),以減少擴容次數(shù)。擴容步驟:分配新的更大內(nèi)存空間(大小為新容量);將舊內(nèi)存中的元素復(fù)制(或移動)到新內(nèi)存;釋放舊內(nèi)存;更新vector的內(nèi)部指針(data、size、capacity)。擴容會導(dǎo)致迭代器、指針、引用失效(因為元素位置改變)。可通過reserve(n)預(yù)先分配足夠容量,避免頻繁擴容。20.map和unordered_map的區(qū)別?map基于紅黑樹(平衡二叉搜索樹)實現(xiàn),元素按鍵值升序排列(默認使用less<T>比較器),插入、刪除、查找的時間復(fù)雜度均為O(logn)。unordered_map基于哈希表實現(xiàn),通過哈希函數(shù)將鍵映射到桶(bucket),平均查找時間復(fù)雜度為O(1)(最壞情況O(n),哈希沖突嚴(yán)重時)。map適用于需要有序遍歷或?qū)π阅芊€(wěn)定性要求高的場景(如需要按順序輸出鍵值對);unordered_map適用于快速查找的場景(如緩存系統(tǒng))。map的迭代器是雙向迭代器,unordered_map的迭代器是前向迭代器。21.左值引用和右值引用的區(qū)別?左值引用(T&)綁定到左值(可尋址、有名字的對象,如變量、數(shù)組元素),用于避免拷貝,修改對象值。右值引用(T&&)是C++11引入的特性,綁定到右值(臨時對象、字面量、表達式結(jié)果,如a+b、5、函數(shù)返回的臨時對象),用于實現(xiàn)移動語義和完美轉(zhuǎn)發(fā)。左值引用不能綁定到右值(除非使用constT&,可綁定右值但不可修改),右值引用不能直接綁定到左值(但可通過std::move將左值轉(zhuǎn)換為右值引用)。右值引用的引入減少了不必要的拷貝操作,提高了程序性能(如vector插入臨時對象時,使用移動構(gòu)造而非拷貝構(gòu)造)。22.移動語義和拷貝語義的區(qū)別?拷貝語義(拷貝構(gòu)造函數(shù)、拷貝賦值運算符)用于創(chuàng)建對象的副本,源對象的狀態(tài)保持不變。移動語義(移動構(gòu)造函數(shù)、移動賦值運算符,C++11引入)用于將源對象的資源(如動態(tài)內(nèi)存、文件句柄)轉(zhuǎn)移到目標(biāo)對象,源對象變?yōu)橛行У炊x的狀態(tài)(通常為空)。移動語義適用于處理大對象或資源密集型對象,避免深拷貝的開銷。例如,vector的push_back(constT&val)調(diào)用拷貝構(gòu)造函數(shù),push_back(T&&val)調(diào)用移動構(gòu)造函數(shù)(若T支持)。移動操作需要源對象是右值(或通過std::move轉(zhuǎn)換為右值)。23.完美轉(zhuǎn)發(fā)的實現(xiàn)方式?完美轉(zhuǎn)發(fā)指在函數(shù)模板中,將參數(shù)原封不動地傳遞給其他函數(shù),保持其左值/右值屬性。C++11通過萬能引用(T&&,結(jié)合模板類型推導(dǎo))和std::forward實現(xiàn)。例如:template<typenameT>voidwrapper(T&&arg){other_func(std::forward<T>(arg));}當(dāng)arg是左值時,T推導(dǎo)為左值引用(如int&),std::forward<T>返回左值引用;當(dāng)arg是右值時,T推導(dǎo)為非引用類型(如int),std::forward<T>返回右值引用。這樣other_func接收到的參數(shù)與原始參數(shù)的左值/右值屬性一致,避免不必要的拷貝或移動。24.拷貝構(gòu)造函數(shù)的作用及何時調(diào)用?拷貝構(gòu)造函數(shù)是特殊的構(gòu)造函數(shù),參數(shù)為constT&(或T&,但通常為const),用于根據(jù)已存在的對象創(chuàng)建新對象的副本。拷貝構(gòu)造函數(shù)的典型調(diào)用場景包括:用一個對象初始化另一個對象(如Tobj2=obj1;);函數(shù)參數(shù)按值傳遞(如voidfunc(Tobj),調(diào)用時拷貝實參);函數(shù)返回值按值返回(如Tfunc(){Tobj;returnobj;},返回時拷貝臨時對象)。若未顯式定義拷貝構(gòu)造函數(shù),編譯器會提供默認版本(淺拷貝,逐成員復(fù)制),對于包含動態(tài)內(nèi)存的類,需自定義拷貝構(gòu)造函數(shù)實現(xiàn)深拷貝,避免懸垂指針問題。25.賦值運算符重載需要注意哪些問題?賦值運算符(operator=)用于對象間的賦值操作,需注意以下幾點:返回類型通常為T&,支持連續(xù)賦值(如a=b=c;)。參數(shù)類型通常為constT&,避免不必要的拷貝。檢查自賦值(如if(this==&rhs)returnthis;),防止釋放自身內(nèi)存后訪問。釋放當(dāng)前對象的資源(如動態(tài)內(nèi)存),再復(fù)制源對象的資源(深拷貝),避免內(nèi)存泄漏。若類中包含指針成員,需自定義賦值運算符(默認版本為淺拷貝,可能導(dǎo)致多個對象指向同一內(nèi)存,釋放時重復(fù)delete)。若類中聲明了移動賦值運算符(T&operator=(T&&rhs)),編譯器不會提供默認的拷貝賦值運算符,需顯式定義或使用=default。26.菱形繼承的問題及解決方法?菱形繼承(鉆石繼承)指派生類同時繼承兩個共享同一基類的派生類,導(dǎo)致基類在派生類中存在多份副本。例如:classA{};classB:publicA{};classC:publicA{};classD:publicB,publicC{};此時D中會包含B::A和C::A兩份A的實例,訪問A的成員時會產(chǎn)生二義性(如d.A::member,需顯式指定作用域)。解決方法是使用虛繼承(virtualinheritance):在B和C繼承A時聲明為virtualpublicA,這樣D中只會保留一份A的實例,虛繼承通過虛基表(virtualbasetable)記錄基類的偏移量,確保成員訪問的唯一性。27.虛繼承的作用?虛繼承用于解決菱形繼承中的二義性和數(shù)據(jù)冗余問題。當(dāng)基類被聲明為虛基類(如classB:virtualpublicA),派生類在繼承時會共享同一基類實例,避免多份拷貝。虛繼承的實現(xiàn)依賴虛基表指針(vbptr),每個虛繼承的派生類對象包含一個vbptr,指向虛基表,表中存儲虛基類相對于該對象的偏移量。通過vbptr和偏移量,運行時可以正確訪問虛基類的成員。虛繼承增加了內(nèi)存開銷(需存儲vbptr)和訪問復(fù)雜度,但保證了繼承的正確性。28.類成員的初始化順序?類成員的初始化順序由聲明順序決定,與構(gòu)造函數(shù)初始化列表中的順序無關(guān)。例如:classA{inta;intb;public:A(intx):b(x),a(b){}//a先初始化(使用未初始化的b),導(dǎo)致未定義行為};此例中a先于b聲明,因此a先初始化(此時b未初始化,值為隨機),b后初始化。正確做法是按聲明順序初始化。靜態(tài)成員變量在類外初始化,且在程序啟動時初始化(早于非靜態(tài)成員)?;惓蓡T先于派生類成員初始化,虛基類成員先于非虛基類成員初始化。29.構(gòu)造函數(shù)和析構(gòu)函數(shù)中能否調(diào)用虛函數(shù)?在構(gòu)造函數(shù)中調(diào)用虛函數(shù),不會發(fā)生動態(tài)多態(tài),調(diào)用的是當(dāng)前類的虛函數(shù)版本。因為構(gòu)造派生類對象時,基類構(gòu)造函數(shù)先執(zhí)行,此時派生類的虛表尚未初始化(對象類型為基類),無法調(diào)用派生類的虛函數(shù)。同理,析構(gòu)函數(shù)中調(diào)用虛函數(shù),調(diào)用的是當(dāng)前類的版本(派生類析構(gòu)函數(shù)執(zhí)行時,派生類的虛表已被銷毀,對象類型退化為基類)。因此,構(gòu)造/析構(gòu)函數(shù)中應(yīng)避免調(diào)用虛函數(shù),否則可能導(dǎo)致未定義行為。30.volatile的作用?volatile關(guān)鍵字告知編譯器變量可能被程序外部因素(如多線程、硬件中斷)修改,禁止編譯器對該變量的訪問進行優(yōu)化(如緩存到寄存器、重排序)。volatile變量每次訪問都從內(nèi)存中讀取,寫入時立即刷新到內(nèi)存。常見應(yīng)用場景:多線程共享的標(biāo)志變量(如終止線程的標(biāo)志)、硬件寄存器(如傳感器數(shù)據(jù))。注意:volatile不保證原子性(如i++操作非原子,需結(jié)合原子類型或互斥鎖),也不能替代互斥鎖實現(xiàn)線程安全。31.extern"C"的作用?extern"C"是C++特有的聲明,用于指定函數(shù)以C的命名規(guī)則(namemangling)編譯,解決C和C++混合編程時的鏈接問題。C++編譯器會對函數(shù)名進行修飾(如添加參數(shù)類型信息),而C編譯器不修飾函數(shù)名。使用extern"C"聲明的函數(shù),其符號名與C兼容,可被C代碼調(diào)用。例如:extern"C"voidfunc();//該函數(shù)以C風(fēng)格編譯常用于封裝C庫供C++程序調(diào)用,或C++函數(shù)需被C程序調(diào)用的場景。32.類型轉(zhuǎn)換運算符有哪些?各自的應(yīng)用場景?C++提供四種顯式類型轉(zhuǎn)換運算符:static_cast:用于基本類型轉(zhuǎn)換(如int轉(zhuǎn)double)、有繼承關(guān)系的指針/引用轉(zhuǎn)換(向上轉(zhuǎn)型安全,向下轉(zhuǎn)型不安全)、void與其他指針的轉(zhuǎn)換。無法轉(zhuǎn)換掉const/volatile屬性。dynamic_cast:用于有虛函數(shù)的類的指針/引用的向下轉(zhuǎn)型(基類轉(zhuǎn)派生類)。指針轉(zhuǎn)換失敗返回nullptr,引用轉(zhuǎn)換失敗拋出std::bad_cast異常。依賴RTTI,需基類有虛函數(shù)。const_cast:用于添加或移除const/volatile屬性(如將constint轉(zhuǎn)換為int,需確保目標(biāo)對象非const,否則修改會導(dǎo)致未定義行為)。reinterpret_cast:用于底層位模式的重新解釋(如將int轉(zhuǎn)換為指針,或不同類型指針間的轉(zhuǎn)換),安全性最低,需謹慎使用。33.函數(shù)指針和指針函數(shù)的區(qū)別?函數(shù)指針是指向函數(shù)的指針,其類型由函數(shù)的參數(shù)和返回類型決定。聲明形式為:返回類型(指針名)(參數(shù)類型列表)。例如:int(func_ptr)(int,int)=&add;可通過func_ptr(1,2)調(diào)用函數(shù)。指針函數(shù)是返回指針的函數(shù),聲明形式為:返回類型函數(shù)名(參數(shù)類型列表)。例如:intcreate_array(intn){returnnewint[n];}。函數(shù)指針用于實現(xiàn)回調(diào)機制(如注冊事件處理函數(shù)),指針函數(shù)用于動態(tài)分配內(nèi)存并返回指針。34.lambda表達式的捕獲方式有哪些?lambda表達式(C++11引入)用于定義匿名函數(shù)對象,捕獲列表指定如何訪問外部作用域的變量。捕獲方式包括:值捕獲([var]):拷貝外部變量var的值,lambda內(nèi)部修改不影響外部(除非使用mutable關(guān)鍵字)。引用捕獲([&var]):引用外部變量var,修改會影響外部。隱式值捕獲([=]):默認值捕獲所有外部變量。隱式引用捕獲([&]):默認引用捕獲所有外部變量。混合捕獲([=,&var]):默認值捕獲,var引用捕獲;或[&,var],默認引用捕獲,var值捕獲。lambda的參數(shù)列表(如(inta,intb))和返回類型(可省略,由編譯器推導(dǎo))與普通函數(shù)類似。35.RAII的原理及應(yīng)用?RAII(ResourceAcquisitionIsInitialization,資源獲取即初始化)是C++管理資源的核心技術(shù),利用對象生命周期自動管理資源。資源(如內(nèi)存、文件句柄、互斥鎖)在對象構(gòu)造時獲取,在析構(gòu)時釋放。當(dāng)對象離開作用域時(如函數(shù)返回、塊結(jié)束),析構(gòu)函數(shù)自動調(diào)用,確保資源釋放。典型應(yīng)用包括智能指針(如shared_ptr在引用計數(shù)為0時釋放內(nèi)存)、互斥鎖的lock_guard(構(gòu)造時加鎖,析構(gòu)時解鎖)。RAII避免了手動釋放資源可能導(dǎo)致的遺漏或錯誤,提高了代碼的健壯性。36.C++11有哪些新特性?C++11引入了大量新特性,主要包括:右值引用(T&&)和移動語義,減少拷貝開銷。智能指針(unique_ptr、shared_ptr、weak_ptr),自動管理內(nèi)存。lambda表達式,支持匿名函數(shù)。范圍for循環(huán)(for(auto&elem:container)),簡化遍歷。類型推導(dǎo)(auto、decltype),自動推斷變量類型。變長模板(variadictemplates),支持任意數(shù)量參數(shù)的模板。constexpr,聲明編譯時常量表達式,提高性能。線程庫(<thread>、<mutex>、<condition_variable>),支持多線程編程。nullptr,替代NULL,避免指針與整數(shù)的歧義。基于范圍的初始化(uniforminitialization),使用{}統(tǒng)一初始化方式。原子類型(std::atomic),支持無鎖編程。37.線程安全的定義及實現(xiàn)方法?線程安全指多個線程同時訪問某段代碼或數(shù)據(jù)時,不會導(dǎo)致數(shù)據(jù)不一致或程序崩潰。實現(xiàn)方法包括:互斥鎖(std::mutex、std::recursive_mutex):通過加鎖保證同一時間只有一個線程訪問共享資源。原子操作(std::atomic<T>):使用原子類型保證操作的原子性(如i++的原子實現(xiàn))。無鎖數(shù)據(jù)結(jié)構(gòu):通過CAS(CompareAndSwap)等操作實現(xiàn)線程安全,避免鎖競爭。線程本地存儲(thread_local):每個線程擁有獨立的變量副本,避免共享。不可變數(shù)據(jù):使用const或不可變對象,確保數(shù)據(jù)不被修改。需注意死鎖、競態(tài)條件(racecondition)、活鎖等問題。38.互斥鎖和自旋鎖的區(qū)別?互斥鎖(mutex)在獲取鎖失敗時,線程進入阻塞狀態(tài)(放棄CPU時間),適用于鎖持有時間較長的場景。自旋鎖(spinlock)在獲取鎖失敗時,線程循環(huán)檢查鎖狀態(tài)(忙等待),不放棄CPU時間,適用于鎖持有時間很短的場景(如內(nèi)核臨界區(qū))?;コ怄i的開銷主要來自線程切換(上下文切換),自旋鎖的開銷來自CPU空轉(zhuǎn)。C++標(biāo)準(zhǔn)庫未直接提供自旋鎖,可通過原子變量(如std::atomic_flag)實現(xiàn)簡單自旋鎖。39.條件變量的使用場景?條件變量(std::condition_variable)用于線程間的協(xié)調(diào)通信,當(dāng)某個條件滿足時通知等待的線程繼續(xù)執(zhí)行。典型場景:生產(chǎn)者消費者模型中,消費者線程等待隊列非空(條件滿足)時被喚醒;生產(chǎn)者線程添加元素后通知消費者。使用條件變量需配合互斥鎖(通常為std::unique_lock),避免競態(tài)條件。流程:線程1獲取鎖,檢查條件,若不滿足則調(diào)用wait()釋放鎖并阻塞;線程2修改條件后調(diào)用notify_one()或notify_all()喚醒等待線程,線程1被喚醒后重新獲取鎖并檢查條件(可能存在虛假喚醒,需循環(huán)檢查條件)。40.死鎖的產(chǎn)生條件及避免方法?死鎖的四個必要條件:互斥:資源同一時間只能被一個線程占用。占有并等待:線程持有至少一個資源,同時等待其他資源。不可搶占:資源只能由持有者主動釋放,不能被其他線程搶占。循環(huán)等待:多個線程形成環(huán)形等待鏈(線程1等線程2的資源,線程2等線程1的資源)。避免方法:破壞互斥:使用可共享的資源(如只讀數(shù)據(jù)),但多數(shù)資源無法共享。破壞占有并等待:一次性申請所有需要的資源(如按順序加鎖)。破壞不可搶占:使用可搶占的鎖(如std::try_lock嘗試非阻塞加鎖,失敗則釋放已持有鎖)。破壞循環(huán)等待:對資源編號,按固定順序申請資源(如總是先鎖資源A,再鎖資源B)。41.C++內(nèi)存模型中的原子操作?C++11引入內(nèi)存模型(memorymodel),定義了多線程環(huán)境下對共享內(nèi)存的訪問規(guī)則。原子操作(std::atomic<T>)保證操作的不可分割性,避免競態(tài)條件。原子類型支持的操作包括讀(load)、寫(store)、交換(exchange)、比較并交換(compare_exchange_weak/compare_exchange_strong)等。內(nèi)存順序(memory_order)指定操作的同步語義,如memory_order_seq_cst(順序一致性,最嚴(yán)格)、memory_order_relaxed(僅保證原子性,無順序約束)、memory_order_acquire/memory_order_release(獲取/釋放語義,保證操作的可見性)。合理選擇內(nèi)存順序可提高性能。42.大端模式和小端模式的區(qū)別?大端模式(BigEndian)中,數(shù)據(jù)的高位字節(jié)存儲在低地址,低位字節(jié)存儲在高地址(如0x12345678存儲為0x120x340x560x78)。小端模式(LittleEndian)中,數(shù)據(jù)的低位字節(jié)存儲在低地址,高位字節(jié)存儲在高地址(如0x12345678存儲為0x780x560x340x12)。常見CPU架構(gòu)中,x86為小端模式,ARM可配置大小端,網(wǎng)絡(luò)字節(jié)序(如TCP/IP)采用大端模式。可通過聯(lián)合體(union)或位運算檢測系統(tǒng)的字節(jié)序:unionCheckEndian{inti;charc;};CheckEndiance;ce.i=1;boolisLittleEndian=(ce.c==1);//小端返回true43.結(jié)構(gòu)體字節(jié)對齊的規(guī)則?結(jié)構(gòu)體字節(jié)對齊是為了提高CPU訪問內(nèi)存的效率(CPU通常按字長訪問內(nèi)存,非對齊訪問可能需要多次讀取)。對齊規(guī)則由編譯器和pragmapack指令共同決定,主要規(guī)則:結(jié)構(gòu)體每個成員的起始地址必須是其自身大小的整數(shù)倍(如int占4字節(jié),起始地址需是4的倍數(shù))。結(jié)構(gòu)體的總大小必須是所有成員中最大對齊數(shù)的整數(shù)倍(填充字節(jié)以滿足)。嵌套
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘇州科技大學(xué)《無線傳感網(wǎng)絡(luò)》2023-2024學(xué)年第二學(xué)期期末試卷
- 襄陽科技職業(yè)學(xué)院《身邊的毒物》2023-2024學(xué)年第二學(xué)期期末試卷
- 寧夏職業(yè)技術(shù)學(xué)院《醫(yī)療法律事務(wù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 云南商務(wù)職業(yè)學(xué)院《汽車檢測與診斷技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2026重慶市派往某國有物業(yè)公司巴南工程維修崗位1人備考題庫參考答案詳解
- 沈陽師范大學(xué)《病理學(xué)B》2023-2024學(xué)年第二學(xué)期期末試卷
- 泉州師范學(xué)院《衛(wèi)生監(jiān)督學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 上海外國語大學(xué)《表面工程應(yīng)用案例與解析》2023-2024學(xué)年第二學(xué)期期末試卷
- 南昌工程學(xué)院《銀發(fā)產(chǎn)業(yè)管理學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 新疆天山職業(yè)技術(shù)大學(xué)《公共政策評估》2023-2024學(xué)年第二學(xué)期期末試卷
- 公司安全環(huán)保部年終工作總結(jié)
- 2025版新《中華人民共和國治安管理處罰法》全文課件(原創(chuàng))
- 2025至2030中國鴿子養(yǎng)殖行業(yè)市場發(fā)展現(xiàn)狀及競爭格局與投資發(fā)展報告
- 借用妹妹名字買房協(xié)議書
- 三萜合酶的挖掘鑒定與三萜化合物細胞工廠構(gòu)建研究
- 沖突解決之道醫(yī)患溝通實踐案例分析
- SJG01-2010地基基礎(chǔ)勘察設(shè)計規(guī)范
- 2024屆新高考語文高中古詩文必背72篇 【原文+注音+翻譯】
- DZ∕T 0217-2020 石油天然氣儲量估算規(guī)范
- DL-T439-2018火力發(fā)電廠高溫緊固件技術(shù)導(dǎo)則
- 網(wǎng)站對歷史發(fā)布信息進行備份和查閱的相關(guān)管理制度及執(zhí)行情況說明(模板)
評論
0/150
提交評論