日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

考研复试专业课面试——C++

發(fā)布時間:2023/12/14 c/c++ 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 考研复试专业课面试——C++ 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

記:此篇博客是關(guān)于考研復(fù)試中專業(yè)課面試的相關(guān)知識點,按個人理解以及網(wǎng)上查資料來總結(jié)的,用來鍛煉自己的邏輯思維,可能不太準(zhǔn)確,希望指正。

1、什么是虛函數(shù)和純虛函數(shù)?

? ? 基類指針可以指向其公有派生類對象,但當(dāng)用基類指針訪問其指向的派生類對象時只能訪問該派生類從基類繼承而來的對象而不能訪問該派生類中定義的對象,此時就需要虛函數(shù)來解決這個問題。

? ? ?虛函數(shù)是在基類中用virtual關(guān)鍵字說明并在派生類中被重新定義的成員函數(shù),引入數(shù)函數(shù)的目的是為了動態(tài)綁定。引入純虛函數(shù)的目的是為了派生接口,即在基類中為其派生類保留一個函數(shù)接口,以便于其派生類根據(jù)自己的需要進行重新定義。純虛函數(shù)沒有函數(shù)體,不具備函數(shù)功能,不能被調(diào)用。聲明純虛函數(shù)時令其等于0只是起到一個形式上的作用,并不代表其返回值為0,若一個類至少包含一個純虛函數(shù),則稱該類為抽象類。

2、基類為什么要有虛析構(gòu)函數(shù)?

? ? 如果沒有虛析構(gòu)函數(shù),在銷毀一個由基類指針指向的派生類對象時,只能調(diào)用基類的析構(gòu)函數(shù)而不能調(diào)用派生類的析構(gòu)函數(shù),導(dǎo)致派生類對象所申請的空間無法釋放而造成內(nèi)存泄漏,此時就可以通過定義虛析構(gòu)函數(shù),以便通過基類指針銷毀派生類對象。

3、當(dāng)i是一個整數(shù)時,i++和++i哪一個更快?他們的區(qū)別是什么?

? ? 當(dāng)i是一個整數(shù)時,他們基本一樣快。他們的區(qū)別在于:i++是先使用變量i,再使i的值加1,而++i是先使i的值加1,再使用i。也就是說i++返回的是i的值,而++i返回的是i+1的值。

4、指針和引用的區(qū)別?

? ? 指針和引用的本質(zhì)區(qū)別在于:指針是一個新的變量,只不過這個變量存儲的是另一個變量的地址,可以通過該地址即指針變量來訪問原來的變量,這種方式成為間接訪問,需要用間接運算符*。引用只是另一個變量的別名,它和原本的變量擁有相同的地址,對引用的操作即是對該變量的操作,這種訪問方式稱為直接訪問,不需要間接運算符,所以使用引用可以簡化操作。

? ? 指針在做為函數(shù)參數(shù)時,內(nèi)部是值傳遞,指針的值是不能改變的,要通過解引用才能夠?qū)υ兞窟M行操作。引用在做函數(shù)參數(shù)時,內(nèi)部傳遞的實際是變量的地址。

5、static關(guān)鍵字的作用?

? ? 修飾局部變量:局部變量本來存儲在動態(tài)區(qū),被static修飾后為靜態(tài)變量,改變了其存儲位置,存儲在靜態(tài)區(qū)。其生命周期與程序相同,在main函數(shù)之前初始化,在程序退出時銷毀。

? ? 修飾全局變量:全局變量本來就存儲在靜態(tài)區(qū),所以static修飾并不能改變其存儲位置,但是可以改變其作用域,只有包含該變量定義的文件才能訪問。

? ? 修飾函數(shù):static修飾函數(shù)作用也是改變其作用域,至于包含該函數(shù)定義的文件才能調(diào)用。對于靜態(tài)函數(shù)來說,其聲明和定義應(yīng)該在同一個文件中。

? ? 修飾成員變量:static修飾的類成員變量是類的全局變量,被該類的所有對象所共有,包括派生類對象,即所有的對象都只維持同一個實例。所以static修飾的成員變量要在類外進行初始化,而不能在類內(nèi)初始化。

? ? 修飾成員函數(shù):static修飾的成員函數(shù)是該類所有對象所共享的函數(shù),使這個類只存在這一個函數(shù),沒有this指針且被static修飾的成員函數(shù)只能訪問static成員變量。靜態(tài)成員可以獨立訪問,即不必創(chuàng)建對象即可進行訪問。

? ? 當(dāng)同時編譯多個文件時,非static的全局變量或函數(shù)都是具有全局可見性的,也可以被其他的源文件來訪問。對于函數(shù)來講,static修飾只是起到了限制其作用域的作用。

6、為什么static和const不能同時修飾成員函數(shù)?

? ? c++編譯器在實現(xiàn)const的成員函數(shù)時為了使其不改變類的實例的狀態(tài),就添加了參數(shù)const this*,但當(dāng)聲明一個static成員函數(shù)時是不存在this指針的,也就是二者的用法是相沖突的。

7、const的作用?

? ? const可以用來定義變量使其為只讀變量,不能做修該,使用const修飾的變量一定要進行初始化。const還可修飾函數(shù)的參數(shù)或返回值。

? ? const成員函數(shù):也就是在成員函數(shù)的參數(shù)列表后面添加const關(guān)鍵字,const成員函數(shù)可以訪問const的成員變量和非const的成員變量,但是不能修改任何變量。因此,在聲明成員函數(shù)時,如果該函數(shù)不對數(shù)據(jù)成員做修改操作,則可能把其聲明為const成員函數(shù)。

? ? const對象只能訪問const成員函數(shù)不能訪問非const成員函數(shù),非const對象可以訪問任意成員函數(shù),包括const成員函數(shù)。

8、C++的多態(tài)性?

? ? 多態(tài)性可以簡單的概括為“一個接口,多種方法”,分為編譯時多態(tài)性和運行時多態(tài)性,編譯時多態(tài)性通過重載函數(shù)(重載)實現(xiàn),運行時多態(tài)性通過虛函數(shù)(重寫)實現(xiàn)。重載要求函數(shù)名相同但函數(shù)的參數(shù)列表不相同,重寫要求函數(shù)名,函數(shù)類型,函數(shù)參數(shù)列表都相同。

? ? 多態(tài)和非多態(tài)的區(qū)別就是函數(shù)地址是早綁定還是晚綁定。如果函數(shù)調(diào)用在編譯時就能確定函數(shù)的調(diào)用地址則是靜態(tài)的,即函數(shù)地址是早綁定,若函數(shù)調(diào)用在編譯時不能確定函數(shù)的調(diào)用地址需要在運行時才能確定則是動態(tài)的,即函數(shù)地址是晚綁定。

? ? 常見的用法是聲明基類的指針,用該指針指向派生類對象,調(diào)用相應(yīng)的虛函數(shù),根據(jù)指針指向的派生類對象的不同而實現(xiàn)不同的方法。

9、面向?qū)ο蠛兔嫦蜻^程的區(qū)別?

? ? 面向過程:是分析出解決問題的步驟,然后用函數(shù)一步一步實現(xiàn)這些步驟,在使用時就依次調(diào)用函數(shù)。優(yōu)點是:比面向?qū)ο蟮男阅芨?#xff0c;因為類需要實例化,開銷比較大,比較消耗資源,缺點是:沒有面向?qū)ο笠讛U展,易維護,易復(fù)用。

? ? 面向?qū)ο?#xff1a;是把要解決的問題劃分成各個對象,建立對象的目的是為了描述某個事物在整個問題解決步驟中的行為。優(yōu)點是:易維護,易復(fù)用,易擴展,因為面向?qū)ο缶哂蟹庋b、繼承和多態(tài)性,可以設(shè)計出低耦合的系統(tǒng),使系統(tǒng)更加靈活,易于維護。缺點是:性能較低。

10、C和C++的區(qū)別?

? ? C語言是面向過程的語言,是結(jié)構(gòu)化的語言,考慮如何通過一個過程對輸入進行處理得到輸出。C++是面向?qū)ο蟮恼Z言,考慮如何根據(jù)具體問題域建立一個合適的對象模型,具有“封裝、繼承和多態(tài)”的特性。封裝隱藏了實現(xiàn)細(xì)節(jié),使代碼模塊化;派生類繼承父類的方法和數(shù)據(jù),擴展原有的模塊,實現(xiàn)了代碼的復(fù)用;多態(tài)性是“一個接口,多個方法”,通過派生類重寫父類的虛函數(shù),實現(xiàn)接口的復(fù)用。

? ? c語言用malloc和free動態(tài)管理內(nèi)存,不支持函數(shù)重載,沒有引用;c++用new和delete動態(tài)管理內(nèi)存,支持函數(shù)重載,有引用的概念。?

11、虛函數(shù)表是針對類的還是針對對象的?同一個類的兩個對象的虛函數(shù)表是怎么維護的?

? ? 編譯器為一個類維護一個虛函數(shù)表,每個對象的首地址保存著該虛函數(shù)表的指針,同一個類的不同對象指向同一張?zhí)摵瘮?shù)表。在類內(nèi)部添加一個指向該虛函數(shù)表的指針,該虛函數(shù)表保存所有對象的虛函數(shù)入口地址,可以根據(jù)此虛函數(shù)表找到自己的函數(shù)的入口,每個類的虛函數(shù)表都不一樣。對于純虛函數(shù)來說,相當(dāng)于一個占位符,純虛函數(shù)在虛函數(shù)表中占一個位置,當(dāng)派生類實現(xiàn)后再把真正的函數(shù)指針填進去。

12、內(nèi)聯(lián)函數(shù)和宏定義的區(qū)別?const和#define的區(qū)別?

? ? 宏定義是在預(yù)編譯時把所有的宏名用宏體來替換,簡單來說就是字符串的替換。內(nèi)聯(lián)函數(shù)是在編譯時進行代碼插入,在調(diào)用內(nèi)聯(lián)函數(shù)的地方直接把內(nèi)聯(lián)函數(shù)的內(nèi)容展開,省去了函數(shù)調(diào)用時的壓棧和出棧操作,提高了效率。內(nèi)聯(lián)函數(shù)是嵌入代碼,在調(diào)用函數(shù)時不進行跳轉(zhuǎn)而是把內(nèi)聯(lián)函數(shù)的代碼插入到相應(yīng)位置。內(nèi)聯(lián)函數(shù)在編譯時要進行參數(shù)類型檢查,因此內(nèi)聯(lián)函數(shù)更安全、可靠,但這是犧牲空間來換取的性能提升。

? ? const是在編譯時替換,define是在預(yù)處理的時候替換;define沒有類型,不進行類型檢查,const有類型,要進行類型檢查。

13、堆和棧的區(qū)別?

? ? 管理方式:棧是由編譯器自動管理而堆需要手動釋放。

? ? 增長方向:棧向下增長,以降序分配存儲空間;堆是向上增長,以升序分配存儲空間

? ? 是否產(chǎn)生碎片:進棧和出棧都是按照順序依次進行的,不會產(chǎn)生碎片;堆要頻繁的進行new和delete,造成存儲空間不連續(xù),易產(chǎn)生碎片。

? ? 分配方式:棧能夠進行動態(tài)分配也能靜態(tài)分配;堆只能進行動態(tài)分配。

? ? 分配效率:棧是系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計算機在底層對其進行支持,進棧和出棧都有專門的指令;堆是由c或c++函數(shù)庫提供的,且機制比較復(fù)雜,棧的效率比堆的效率要高,但是卻沒有堆靈活。

14、c++中類與結(jié)構(gòu)體的區(qū)別?

? ? 最大的區(qū)別就是默認(rèn)訪問控制,struct作為數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)體,其默認(rèn)的數(shù)據(jù)訪問控制為public,class作為類的實現(xiàn)體,其默認(rèn)的成員訪問控制為private的。并且class可以用于定義模板參數(shù),類似于typename,而struct則不能定義模板參數(shù)。

15、析構(gòu)函數(shù)的作用?

? ? 析構(gòu)函數(shù)用于釋放定義的對象的指針,默認(rèn)的析構(gòu)函數(shù)不是顯示調(diào)用的,自定義的析構(gòu)函數(shù)要進行顯示調(diào)用。

? ? 當(dāng)類里面只用到了基本數(shù)據(jù)類型,如int double等時,系統(tǒng)的默認(rèn)析構(gòu)函數(shù)不進行任何操作;當(dāng)用到如vector和string等數(shù)據(jù)類型時,會自己調(diào)用系統(tǒng)默認(rèn)的析構(gòu)函數(shù)。

? ? 如果是自定義的析構(gòu)函數(shù),且占用了內(nèi)存空間等資源時,在程序結(jié)束時需要調(diào)用自定義的析構(gòu)函數(shù)來釋放掉占用的資源,防止內(nèi)存泄漏。

16、操作系統(tǒng)和編譯器如何區(qū)分全局變量和局部變量?

? ? 操作系統(tǒng)只管進程調(diào)度,編譯器根據(jù)變量存儲空間的分配位置來判斷,全局變量分配在全局?jǐn)?shù)據(jù)段(靜態(tài)存儲區(qū))并在程序運行前加載,局部變量分配在(動態(tài)存儲區(qū))棧中。

17、結(jié)構(gòu)體和聯(lián)合體的區(qū)別?

? ? 結(jié)構(gòu)體和聯(lián)合體都是由不同類型的數(shù)據(jù)成員所構(gòu)成的,聯(lián)合體中在某一個時間點只能有一個變量成員存在,所有的變量成員共享一段內(nèi)存空間,對聯(lián)合體不同成員賦值時會對其他成員進行重寫,其他成員的值就不存在了。結(jié)構(gòu)體中在某一個時間點所有變量成員均存在,且所有變量的內(nèi)存地址不同,對結(jié)構(gòu)體的成員賦值時是不會產(chǎn)生相互影響的。

18、重載和重寫的區(qū)別?

? ? 從定義上來說:重載時允許存在多個同名函數(shù),但這些函數(shù)的參數(shù)表不同(可能是參數(shù)個數(shù)不同,可能是參數(shù)類型不同,可能兩者都不相同),重寫是子類對父類中的虛函數(shù)重新定義。

? ? 從實現(xiàn)原理上來說:重載時編譯器根據(jù)函數(shù)不同的參數(shù)表,對函數(shù)的名稱進行處理,使這些同名函數(shù)成為不同的函數(shù)。重寫是當(dāng)子類對父類虛函數(shù)進行重新定義后,父類指針根據(jù)賦給其不同的子類指針,動態(tài)的調(diào)用該子類的函數(shù),在編譯時不能確定調(diào)用的是哪個函數(shù)。

19、有關(guān)純虛函數(shù)的理解?

? ? 純虛函數(shù)是為你的程序制定的一種標(biāo)準(zhǔn),它只是一個接口,需要在子類中進行實現(xiàn),且純虛函數(shù)沒有函數(shù)體,不具備函數(shù)功能,不能被調(diào)用。包含純虛函數(shù)的類為抽象類,這種類不能直接生成對象,需要在子類中重寫虛函數(shù)之后才能夠使用。

? ? 虛函數(shù)是為了繼承接口和默認(rèn)行為,實現(xiàn)動態(tài)綁定。純虛函數(shù)只是為了繼承接口,行為必須重新定義。

20、內(nèi)存溢出、內(nèi)存泄漏的原因?

? ? 內(nèi)存溢出是指在申請內(nèi)存空間時出現(xiàn)沒有足夠的內(nèi)存空間供其使用的情況,內(nèi)存溢出的原因大致有如下4種:

? ? (1) 內(nèi)存中加載的數(shù)據(jù)量過于龐大,例如一次從數(shù)據(jù)庫中取較多的數(shù)據(jù)

? ? (2) 代碼中出現(xiàn)死循環(huán)或者循環(huán)產(chǎn)生過多重復(fù)的對象實體

? ? (3) 遞歸調(diào)用的層次太深導(dǎo)致堆棧溢出

? ? (4) 內(nèi)存泄漏導(dǎo)致內(nèi)存溢出

? ? 內(nèi)存泄漏是指在向系統(tǒng)申請了內(nèi)存空間等資源,在使用完畢后沒有進行資源釋放,而造成占用有效內(nèi)存。

21、為什么要聲明虛基類?

? ? 在當(dāng)基類被多個子類繼承時,在這些繼承路徑的匯合處基類會產(chǎn)生多個實例,從而導(dǎo)致二義性。如果想要這個基類只產(chǎn)生一個實例供所有子類共享使用,則要用virtual關(guān)鍵字把該公共基類聲明為虛基類。

22、c++文件編譯與執(zhí)行的四個階段?

? ? (1)根據(jù)文件中的預(yù)處理指令來修改源文件

? ? (2)編譯成匯編代碼

? ? (3)將匯編代碼翻譯成機器指令

? ? (4)鏈接目標(biāo)代碼生成可執(zhí)行程序

23、定義和聲明的區(qū)別?

? ? 變量聲明:用于告訴程序變量的類型和名字

? ? 變量定義:為變量分配內(nèi)存空間,還可以為變量賦初值,變量有且只有一個定義。在變量定義的同時也是聲明了變量的類型和名字。

? ? extern關(guān)鍵字:用extern關(guān)鍵字是聲明變量而不是定義變量。

24、c++內(nèi)存分配的方式?

? ? (1)在靜態(tài)存儲區(qū)分配內(nèi)存,編譯時分配,在程序運行的整個期間都存在

? ? (2)在棧中分配內(nèi)存,系統(tǒng)自動進行分配和釋放,例如局部變量就是在棧中分配內(nèi)存空間

? ? (3)在堆中分配內(nèi)存,需要程序員手動進行分配和釋放,并指定大小。

? ? 棧可以進行動態(tài)分配和靜態(tài)分配,而堆只能夠進行動態(tài)分配,棧的效率比堆的高但沒有堆靈活。

25、繼承體系下同名成員函數(shù)的關(guān)系?

? ? (1)重載:在同一作用域,函數(shù)名相同,參數(shù)列表不同,返回值類型可以相同也可以不相同

? ? (2)重寫:在不同的作用域(分別在父類和子類),函數(shù)名相同,參數(shù)列表相同,返回值類型相同,基類的函數(shù)需要有virtual關(guān)鍵字聲明。

? ? (3)重定義:在不同的作用域(分別在父類和子類),函數(shù)名相同,在父類和派生類中只要不符合重寫的均是重定義

26、什么情況下會調(diào)用拷貝構(gòu)造函數(shù)(三種情況)?

? ? 類會自動生成構(gòu)造函數(shù):普通構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù),當(dāng)生成一個普通的類對象的時候會自動調(diào)用普通構(gòu)造函數(shù),當(dāng)用一個類對象去初始化另一個對象時會調(diào)用拷貝構(gòu)造函數(shù);

? ? 調(diào)用拷貝構(gòu)造函數(shù)的三種情況:

? ? (1)當(dāng)用一個類的對象去初始化另一個新的對象時

? ? (2)當(dāng)函數(shù)的參數(shù)為類的對象且為值傳遞的時候,當(dāng)為引用時不會調(diào)用

? ? (3)當(dāng)函數(shù)的返回值為類的對象或者引用的時候

27、虛函數(shù)是怎么實現(xiàn)的?

? ? 每一個含有虛函數(shù)的類都有一個虛函數(shù)表,虛函數(shù)表中保存著該類的所有虛函數(shù)的函數(shù)指針(地址),類的實例對象不包含虛函數(shù)表,只有虛函數(shù)指針。

?

c++到此就更新完畢了~

?

總結(jié)

以上是生活随笔為你收集整理的考研复试专业课面试——C++的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。