一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

C和C++經(jīng)典筆試題附答案解析

時(shí)間:2024-09-14 08:24:49 文圣 筆試題目 我要投稿
  • 相關(guān)推薦

C和C++經(jīng)典筆試題附答案解析

  在現實(shí)的學(xué)習、工作中,我們都可能會(huì )接觸到試題,借助試題可以檢測考試者對某方面知識或技能的掌握程度。大家知道什么樣的試題才是好試題嗎?以下是小編整理的C和C++經(jīng)典筆試題附答案解析,希望能夠幫助到大家。

C和C++經(jīng)典筆試題附答案解析

  C和C++筆試題

  1、C和C++的區別

  1)C是面向過(guò)程的語(yǔ)言,是一個(gè)結構化的語(yǔ)言,考慮如何通過(guò)一個(gè)過(guò)程對輸入進(jìn)行處理得到輸出;C++是面向對象的語(yǔ)言,主要特征是“封裝、繼承和多態(tài)”。封裝隱藏了實(shí)現細節,使得代碼模塊化;派生類(lèi)可以繼承父類(lèi)的數據和方法,擴展了已經(jīng)存在的模塊,實(shí)現了代碼重用;多態(tài)則是“一個(gè)接口,多種實(shí)現”,通過(guò)派生類(lèi)重寫(xiě)父類(lèi)的虛函數,實(shí)現了接口的重用。

  2)C和C++動(dòng)態(tài)管理內存的方法不一樣,C是使用malloc/free,而C++除此之外還有new/關(guān)鍵字。

  3)C++支持函數重載,C不支持函數重載

  4)C++中有引用,C中不存在引用的概念

  2、C++中指針和引用的區別

  1)指針是一個(gè)新的變量,存儲了另一個(gè)變量的地址,我們可以通過(guò)訪(fǎng)問(wèn)這個(gè)地址來(lái)修改另一個(gè)變量;

  引用只是一個(gè)別名,還是變量本身,對引用的任何操作就是對變量本身進(jìn)行操作,以達到修改變量的目的

  2)引用只有一級,而指針可以有多級

  3)指針傳參的時(shí)候,還是值傳遞,指針本身的值不可以修改,需要通過(guò)解引用才能對指向的對象進(jìn)行操作

  引用傳參的時(shí)候,傳進(jìn)來(lái)的就是變量本身,因此變量可以被修改

  3、結構體struct和共同體union(聯(lián)合)的區別

  結構體:將不同類(lèi)型的數據組合成一個(gè)整體,是自定義類(lèi)型

  共同體:不同類(lèi)型的幾個(gè)變量共同占用一段內存

  1)結構體中的每個(gè)成員都有自己獨立的地址,它們是同時(shí)存在的;

  共同體中的所有成員占用同一段內存,它們不能同時(shí)存在;

  2)sizeof(struct)是內存對齊后所有成員長(cháng)度的總和,sizeof(union)是內存對齊后最長(cháng)數據成員的長(cháng)度、

  結構體為什么要內存對齊呢?

  4、#define和const的區別

  1)#define定義的常量沒(méi)有類(lèi)型,所給出的是一個(gè)立即數;const定義的常量有類(lèi)型名字,存放在靜態(tài)區域

  2)處理階段不同,#define定義的宏變量在預處理時(shí)進(jìn)行替換,可能有多個(gè)拷貝,const所定義的變量在編譯時(shí)確定其值,只有一個(gè)拷貝。

  3)#define定義的常量是不可以用指針去指向,const定義的常量可以用指針去指向該常量的地址

  4)#define可以定義簡(jiǎn)單的函數,const不可以定義函數

  5、重載overload,覆蓋override,重寫(xiě)overwrite,這三者之間的區別

  1)overload,將語(yǔ)義相近的幾個(gè)函數用同一個(gè)名字表示,但是參數和返回值不同,這就是函數重載

  特征:相同范圍(同一個(gè)類(lèi)中)、函數名字相同、參數不同、virtual關(guān)鍵字可有可無(wú)

  2)override,派生類(lèi)覆蓋基類(lèi)的虛函數,實(shí)現接口的重用

  特征:不同范圍(基類(lèi)和派生類(lèi))、函數名字相同、參數相同、基類(lèi)中必須有virtual關(guān)鍵字(必須是虛函數)

  3)overwrite,派生類(lèi)屏蔽了其同名的基類(lèi)函數

  特征:不同范圍(基類(lèi)和派生類(lèi))、函數名字相同、參數不同或者參數相同且無(wú)virtual關(guān)鍵字

  6、new、、malloc、free之間的關(guān)系

  new/,malloc/free都是動(dòng)態(tài)分配內存的方式

  1)malloc對開(kāi)辟的空間大小嚴格指定,而new只需要對象名

  2)new為對象分配空間時(shí),調用對象的構造函數,調用對象的析構函數

  既然有了malloc/free,C++中為什么還需要new/呢?

  因為malloc/free是庫函數而不是運算符,不能把執行構造函數和析構函數的功能強加于malloc/free

  7、和[]的區別

  只會(huì )調用一次析構函數,而[]會(huì )調用每個(gè)成員的析構函數

  用new分配的內存用釋放,用new[]分配的內存用[]釋放

  8、STL庫用過(guò)嗎?常見(jiàn)的STL容器有哪些?算法用過(guò)幾個(gè)?

  STL包括兩部分內容:容器和算法

  容器即存放數據的地方,比如array, vector,分為兩類(lèi),序列式容器和關(guān)聯(lián)式容器

  序列式容器,其中的元素不一定有序,但是都可以被排序,比如vector,list,queue,stack,heap, priority-queue, slist

  關(guān)聯(lián)式容器,內部結構是一個(gè)平衡二叉樹(shù),每個(gè)元素都有一個(gè)鍵值和一個(gè)實(shí)值,比如map, set, hashtable, hash_set

  算法有排序,復制等,以及各個(gè)容器特定的算法

  迭代器是STL的精髓,迭代器提供了一種方法,使得它能夠按照順序訪(fǎng)問(wèn)某個(gè)容器所含的各個(gè)元素,但無(wú)需暴露該容器的內部結構,它將容器和算法分開(kāi),讓二者獨立設計。

  9、const知道嗎?解釋一下其作用

  const修飾類(lèi)的成員變量,表示常量不可能被修改

  const修飾類(lèi)的成員函數,表示該函數不會(huì )修改類(lèi)中的數據成員,不會(huì )調用其他非const的成員函數

  10、虛函數是怎么實(shí)現的

  每一個(gè)含有虛函數的類(lèi)都至少有有一個(gè)與之對應的虛函數表,其中存放著(zhù)該類(lèi)所有虛函數對應的函數指針(地址),

  類(lèi)的示例對象不包含虛函數表,只有虛指針;

  派生類(lèi)會(huì )生成一個(gè)兼容基類(lèi)的虛函數表。

  11、堆和棧的區別

  1)棧 stack 存放函數的參數值、局部變量,由編譯器自動(dòng)分配釋放

  堆heap,是由new分配的內存塊,由應用程序控制,需要程序員手動(dòng)利用釋放,如果沒(méi)有,程序結束后,操作系統自動(dòng)回收

  2)因為堆的分配需要使用頻繁的new/,造成內存空間的不連續,會(huì )有大量的碎片

  3)堆的生長(cháng)空間向上,地址越大,棧的生長(cháng)空間向下,地址越小

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

  1)函數體內: static 修飾的局部變量作用范圍為該函數體,不同于auto變量,其內存只被分配一次,因此其值在下次調用的時(shí)候維持了上次的值

  2)模塊內:static修飾全局變量或全局函數,可以被模塊內的所有函數訪(fǎng)問(wèn),但是不能被模塊外的其他函數訪(fǎng)問(wèn),使用范圍限制在聲明它的模塊內

  3)類(lèi)中:修飾成員變量,表示該變量屬于整個(gè)類(lèi)所有,對類(lèi)的所有對象只有一份拷貝

  4)類(lèi)中:修飾成員函數,表示該函數屬于整個(gè)類(lèi)所有,不接受this指針,只能訪(fǎng)問(wèn)類(lèi)中的static成員變量

  注意和const的區別!const強調值不能被修改,而static強調唯一的拷貝,對所有類(lèi)的對象

  13、STL中map和set的原理(關(guān)聯(lián)式容器)

  map和set的底層實(shí)現主要通過(guò)紅黑樹(shù)來(lái)實(shí)現

  紅黑樹(shù)是一種特殊的二叉查找樹(shù)

  1)每個(gè)節點(diǎn)或者是黑色,或者是紅色

  2)根節點(diǎn)是黑色

  3) 每個(gè)葉子節點(diǎn)(NIL)是黑色。 [注意:這里葉子節點(diǎn),是指為空(NIL或NULL)的葉子節點(diǎn)!]

  4)如果一個(gè)節點(diǎn)是紅色的,則它的子節點(diǎn)必須是黑色的

  5)從一個(gè)節點(diǎn)到該節點(diǎn)的子孫節點(diǎn)的所有路徑上包含相同數目的黑節點(diǎn)。

  14、#include#include "file.h" 的區別  前者是從標準庫路徑尋找  后者是從當前工作路徑

  15、什么是內存泄漏?面對內存泄漏和指針越界,你有哪些方法?

  動(dòng)態(tài)分配內存所開(kāi)辟的空間,在使用完畢后未手動(dòng)釋放,導致一直占據該內存,即為內存泄漏。

  方法:malloc/free要配套,對指針賦值的時(shí)候應該注意被賦值的指針是否需要釋放;使用的時(shí)候記得指針的長(cháng)度,防止越界

  16、定義和聲明的區別

  聲明是告訴編譯器變量的類(lèi)型和名字,不會(huì )為變量分配空間

  定義需要分配空間,同一個(gè)變量可以被聲明多次,但是只能被定義一次

  17、C++文件編譯與執行的四個(gè)階段

  1)預處理:根據文件中的預處理指令來(lái)修改源文件的內容

  2)編譯:編譯成匯編代碼

  3)匯編:把匯編代碼翻譯成目標機器指令

  4)鏈接:鏈接目標代碼生成可執行程序

  18、STL中的vector的實(shí)現,是怎么擴容的?

  vector使用的注意點(diǎn)及其原因,頻繁對vector調用push_back()對性能的影響和原因。vector就是一個(gè)動(dòng)態(tài)增長(cháng)的數組,里面有一個(gè)指針指向一片連續的空間,當空間裝不下的時(shí)候,會(huì )申請一片更大的空間,將原來(lái)的數據拷貝過(guò)去,并釋放原來(lái)的舊空間。當刪除的時(shí)候空間并不會(huì )被釋放,只是清空了里面的數據。對比array是靜態(tài)空間一旦配置了就不能改變大小。

  vector的動(dòng)態(tài)增加大小的時(shí)候,并不是在原有的空間上持續新的空間(無(wú)法保證原空間的后面還有可供配置的空間),而是以原大小的兩倍另外配置一塊較大的空間,然后將原內容拷貝過(guò)來(lái),并釋放原空間。在VS下是1.5倍擴容,在GCC下是2倍擴容。

  在原來(lái)空間不夠存儲新值時(shí),每次調用push_back方法都會(huì )重新分配新的空間以滿(mǎn)足新數據的添加操作。如果在程序中頻繁進(jìn)行這種操作,還是比較消耗性能的。

  19、STL中unordered_map和map的區別

  map是STL中的一個(gè)關(guān)聯(lián)容器,提供鍵值對的數據管理。底層通過(guò)紅黑樹(shù)來(lái)實(shí)現,實(shí)際上是二叉排序樹(shù)和非嚴格意義上的二叉平衡樹(shù)。所以在map內部所有的數據都是有序的,且map的查詢(xún)、插入、刪除操作的時(shí)間復雜度都是O(logN)。

  unordered_map和map類(lèi)似,都是存儲key-value對,可以通過(guò)key快速索引到value,不同的是unordered_map不會(huì )根據key進(jìn)行排序。unordered_map底層是一個(gè)防冗余的哈希表,存儲時(shí)根據key的hash值判斷元素是否相同,即unoredered_map內部是無(wú)序的。

  20、C++的內存管理

  在C++中,內存被分成五個(gè)區:棧、堆、自由存儲區、靜態(tài)存儲區、常量區

  棧:存放函數的參數和局部變量,編譯器自動(dòng)分配和釋放

  堆:new關(guān)鍵字動(dòng)態(tài)分配的內存,由程序員手動(dòng)進(jìn)行釋放,否則程序結束后,由操作系統自動(dòng)進(jìn)行回收

  自由存儲區:由malloc分配的內存,和堆十分相似,由對應的free進(jìn)行釋放

  全局/靜態(tài)存儲區:存放全局變量和靜態(tài)變量

  常量區:存放常量,不允許被修改

  21、 構造函數為什么一般不定義為虛函數?而析構函數一般寫(xiě)成虛函數的原因 ?

 。1)構造函數不能聲明為虛函數

  1)因為創(chuàng )建一個(gè)對象時(shí)需要確定對象的類(lèi)型,而虛函數是在運行時(shí)確定其類(lèi)型的。而在構造一個(gè)對象時(shí),由于對象還未創(chuàng )建成功,編譯器無(wú)法知道對象的實(shí)際類(lèi)型,是類(lèi)本身還是類(lèi)的派生類(lèi)等等

  2)虛函數的調用需要虛函數表指針,而該指針存放在對象的內存空間中;若構造函數聲明為虛函數,那么由于對象還未創(chuàng )建,還沒(méi)有內存空間,更沒(méi)有虛函數表地址用來(lái)調用虛函數即構造函數了

 。2)析構函數最好聲明為虛函數

  首先析構函數可以為虛函數,當析構一個(gè)指向派生類(lèi)的基類(lèi)指針時(shí),最好將基類(lèi)的析構函數聲明為虛函數,否則可以存在內存泄露的問(wèn)題。

  如果析構函數不被聲明成虛函數,則編譯器實(shí)施靜態(tài)綁定,在刪除指向派生類(lèi)的基類(lèi)指針時(shí),只會(huì )調用基類(lèi)的析構函數而不調用派生類(lèi)析構函數,這樣就會(huì )造成派生類(lèi)對象析構不完全。

  22、靜態(tài)綁定和動(dòng)態(tài)綁定的介紹

  靜態(tài)綁定和動(dòng)態(tài)綁定是C++多態(tài)性的一種特性

  1)對象的靜態(tài)類(lèi)型和動(dòng)態(tài)類(lèi)型

  靜態(tài)類(lèi)型:對象在聲明時(shí)采用的類(lèi)型,在編譯時(shí)確定

  動(dòng)態(tài)類(lèi)型:當前對象所指的類(lèi)型,在運行期決定,對象的動(dòng)態(tài)類(lèi)型可變,靜態(tài)類(lèi)型無(wú)法更改

  2)靜態(tài)綁定和動(dòng)態(tài)綁定

  靜態(tài)綁定:綁定的是對象的靜態(tài)類(lèi)型,函數依賴(lài)于對象的靜態(tài)類(lèi)型,在編譯期確定

  動(dòng)態(tài)綁定:綁定的是對象的動(dòng)態(tài)類(lèi)型,函數依賴(lài)于對象的動(dòng)態(tài)類(lèi)型,在運行期確定

  只有虛函數才使用的是動(dòng)態(tài)綁定,其他的全部是靜態(tài)綁定

  23、 引用是否能實(shí)現動(dòng)態(tài)綁定,為什么引用可以實(shí)現

  可以。因為引用(或指針)既可以指向基類(lèi)對象也可以指向派生類(lèi)對象,這一事實(shí)是動(dòng)態(tài)綁定的關(guān)鍵。用引用(或指針)調用的虛函數在運行時(shí)確定,被調用的函數是引用(或指針)所指的對象的實(shí)際類(lèi)型所定義的。

  24、深拷貝和淺拷貝的區別

  深拷貝和淺拷貝可以簡(jiǎn)單的理解為:如果一個(gè)類(lèi)擁有資源,當這個(gè)類(lèi)的對象發(fā)生復制過(guò)程的時(shí)候,如果資源重新分配了就是深拷貝;反之沒(méi)有重新分配資源,就是淺拷貝。

【C和C++經(jīng)典筆試題附答案解析】相關(guān)文章:

普天C++筆試題及答案03-27

精選C++面試題及答案05-23

華為C/C++筆試題答案10-16

C/C++程序員必備資料 常見(jiàn)筆面試題深入解析12-12

華為C/C++筆經(jīng)10-11

C++筆試題03-25

2016年c++經(jīng)典面試題及答案03-19

部分c/c++筆試題10-26

群碩筆試題Java和C++、C#11-21

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看