1. 程式人生 > >c++面試題整理(含答案)

c++面試題整理(含答案)

知乎連結:

校招主要考察基礎和思維,主要涉及C++語言基礎,資料結構與演算法,TCP/IP協議,網路程式設計,Linux。

C和C++語言基礎

參考書籍:《C++ primer》,《effective C++》,《STL原始碼解析》,《深度搜索C++物件模型》

  • 1當它與"C"一起連用時,如: extern "C" void fun(int a, int b);則告訴編譯器在編譯fun這個函式名時按著C的規則去翻譯相應的函式
  • 2它的作用就是宣告函式或全域性變數的作用範圍的關鍵字,其宣告的函式和變數可以在本模組活其他模組中使用

1 它的第一條也是最重要的一條:隱藏。(static函式,static變數均可)

當同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。

2 static的第二個作用是保持變數內容的持久。(static變數中的記憶功能和全域性生存期)

3.static的第三個作用是預設初始化為0(static變數)

4.static的第四個作用:C++中的類成員宣告static(有些地方與以上作用重疊)

volatile是幹啥的:

const的作用:

1. const僅僅用來修飾右邊的變數(基本資料變數p,指標變數*p)
2. 被const修飾的變數是隻讀的。

0.  屬性 :new/delete是C++關鍵字,需要編譯器支援。malloc/free是庫函式,需要標頭檔案支援。

1. 引數

使用new操作符申請記憶體分配時無須指定記憶體塊的大小,編譯器會根據型別資訊自行計算。而malloc則需要顯式地指出所需記憶體的尺寸。

2.  返回型別

new操作符記憶體分配成功時,返回的是物件型別的指標,型別嚴格與物件匹配,無須進行型別轉換,故new是符合型別安全性的操作符。而malloc記憶體分配成功則是返回void * ,需要通過強制型別轉換將void*指標轉換成我們需要的型別。

3.  分配失敗

new記憶體分配失敗時,會丟擲bac_alloc異常。malloc分配記憶體失敗時返回NULL。

4. 自定義型別

 new會先呼叫operator new函式,申請足夠的記憶體(通常底層使用malloc實現)。然後呼叫型別的建構函式,初始化成員變數,最後返回自定義型別指標。delete先呼叫解構函式,然後呼叫operator delete函式釋放記憶體(通常底層使用free實現)。

         malloc/free是庫函式,只能動態的申請和釋放記憶體,無法強制要求其做自定義型別物件構造和析構工作。

5. 過載

C++允許過載new/delete操作符,特別的,佈局new的就不需要為物件分配記憶體,而是指定了一個地址作為記憶體起始區域,new在這段記憶體上為物件呼叫建構函式完成初始化工作,並返回此地址。而malloc不允許過載。

6.  記憶體區域

new操作符從自由儲存區(free store)上為物件動態分配記憶體空間,而malloc函式從堆上動態分配記憶體。自由儲存區是C++基於new操作符的一個抽象概念,凡是通過new操作符進行記憶體申請,該記憶體即為自由儲存區。而堆是作業系統中的術語,是作業系統所維護的一塊特殊記憶體,用於程式的記憶體動態分配,C語言使用malloc從堆上分配記憶體,使用free釋放已分配的對應記憶體。自由儲存區不等於堆,如上所述,佈局new就可以不位於堆中。

靜態多型和動態多型。靜態多型是指通過模板技術或者函式過載技術實現的多型,其在編譯器確定行為。動態多型是指通過虛擬函式技術實現在執行期動態繫結的技術。

虛擬函式表

虛擬函式的地址被儲存一張叫做虛表的東西里,

每個類都會維護一張虛表,編譯時,編譯器根據類的宣告創建出虛表,當物件被構造時,虛表的地址就會被寫入這個物件記憶體的起始位置。這就是多型性在 C++ 中實現的方式,而像 Java、OC 這樣的語言由於 Runtime 的存在,這些物件會有多餘的記憶體空間記錄類的資訊(meta-object),在執行時根據這些資訊解析出相應的函式去執行。雖然不同,但是異曲同工。


指標和引用的區別:

(1)非空區別。任何情況下都不能使用指向空值的引用。一個引用必須總是指向某 
些物件。因此如果你使用一個變數並讓它指向一個物件,但是該變數在某些時候也可能不指 
向任何物件,這時你應該把變數宣告為指標,因為這樣你可以賦空值給該變數。相反,如果 
變數肯定指向一個物件,例如你的設計不允許變數為空,這時你就可以把變數宣告為引用。 
不存在指向空值的引用這個事實意味著使用引用的程式碼效率比使用指標要高。 
(2)合法性區別。在使用引用之前不需要測試它的合法性。相反,*指標則應該總是被 
測試,防止其為空**。 
(3)可修改區別。指標與引用的另一個重要的區別是指標可以被重新賦值以指向另一 
個不同的物件。但是引用則總是指向在初始化時被指定的物件,以後不能改變,但是指定的 
物件其內容可以改變。 
(4)應用區別。總的來說,在以下情況下應該使用指標:一是考慮到存在不指向任何 
物件的可能(在這種情況下,能夠設定指標為空),二是需要能夠在不同的時刻指向不同的 
物件(在這種情況下,你能改變指標的指向)。如果總是指向一個物件並且一旦指向一個對 
象後就不會改變指向,那麼應該使用引用。

行內函數有什麼優點?行內函數與巨集定義的區別?

行內函數和普通函式相比可以加快程式執行的速度,因為不需要中斷呼叫,在編譯的時候行內函數可以直接被鑲嵌到目的碼中。行內函數要做引數型別檢查,這是行內函數跟巨集相比的優勢。

inline是指嵌入程式碼,就是在呼叫函式的地方不是跳轉,而是把程式碼直接寫到那裡去。對於短小的程式碼來說,inline可以帶來一定的效率提升,而且和C時代的巨集函式相比,inline 更安全可靠。可是這個是以增加空間消耗為代價的。至於是否需要inline函式就需要根據你的實際情況取捨了。

巨集是在程式碼處不加任何驗證的簡單替代,而行內函數是將程式碼直接插入呼叫處,而減少了普通函式呼叫時的資源消耗。

巨集不是函式,只是在編譯前(編譯預處理階段)將程式中有關字串替換成巨集體。

inline函式是函式,但在編譯中不單獨產生程式碼,而是將有關程式碼嵌入到呼叫處。

必須在建構函式初始化式裡進行初始化的資料成員有哪些:

1,常量成員

常量成員只能初始化不能賦值,所以必須放在初始化列表裡。

2,引用型別

引用必須在定義時初始化,並且不能重新賦值,所以必須放在初始化表裡。

3,物件成員

這個成員是其他類的物件,例如上面的Address  addr成員。如果把它放在建構函式的初始化列表裡,此時會呼叫Address類的copy constructor函式,對這個類物件進行初始化。如果把它放在建構函式體中,會先呼叫Address類的default constructor函式,然後再呼叫Address類的copy constructor函式。從效能上考慮,把物件成員的初始化放在初始化列表裡效能會更高。

手寫strcpy,memcpy,strcat,strcmp等函式

相關推薦

c++試題整理答案

知乎連結: 校招主要考察基礎和思維,主要涉及C++語言基礎,資料結構與演算法,TCP/IP協議,網路程式設計,Linux。 C和C++語言基礎 參考書籍:《C++ primer》,《effective C++》,《STL原始碼解析》,《深度搜索C++物件模型》

2019阿里巴巴技術試題集錦答案

為幫助開發者們提升面試技能、有機會入職阿里,雲棲社群特別製作了這個專輯——阿里巴巴資深技術專家們結合多年的工作、面試經驗總結提煉而

前端開發--試題整理JS篇

狀態 state oda 通過 cli 命名空間 script push arguments 1.截取字符串abcdace的acealert(‘abcdace‘.substring(4)); 2.規避javascript多人開發函數重名問題命名空間封閉空間js模塊化mvc(

常見SQL試題整理實時更新

1) 有一張表,裡面有3個欄位:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條SQL語句查詢出這三條記錄並按以下條件顯示出來: 大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。 select (case when 語文

JavaScrip常見面試題彙總答案

一、請解釋 JavaScript 中 this 是如何工作的。 首先:this 永遠指向函式執行時所在的物件,而不是函式被建立時所在的物件。匿名函式或不處於任何物件中的函式指向 window 。 1、 方法呼叫模式 當函式被儲存為物件的一個屬性時,成該函式為該物件的方法。函式中this的

2018年java試題總結答案

1.什麼是B/S架構?C/S架構? B/S(Browser/Server),瀏覽器/伺服器程式; C/S(Client/Server),客戶端/服務端,桌面應用程式。 2.網路協議有哪些? HTTP:超文字傳輸協議; SMPT:簡單郵件協議; TELNET:遠端終端

Java試題總結答案

  1.什麼是B/S架構?C/S架構? B/S(Browser/Server),瀏覽器/伺服器程式; C/S(Client/Server),客戶端/服務端,桌面應用程式。     2.網路協議有哪些? HTTP:超文字傳輸協議;

大型網際網路公司必備的java試題答案

1、作用域public,private,protected,以及不寫時的區別 答:區別如下: 作用域 當前類 同一package 子孫類 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √

演算法經典試題整理java實現

以下從Java角度解釋面試常見的演算法和資料結構:字串,連結串列,樹,圖,排序,遞迴 vs. 迭代,動態規劃,位操作,概率問題,排列組合,以及一些需要尋找規律的題目。 1. 字串和陣列 字串和陣列是最常見的面試題目型別,應當分配最大的時間。 關於字串

python試題整理1-30

第一部分 Python基礎篇(80題)1、為什麼學習Python?     1、語言本身簡潔,優美,功能超級強大,     2、跨平臺,從桌面應用,web開發,自動化測試運維,爬蟲,人工智慧,大資料處理都能做     3、非常火爆的社群     4、很多有名的大公司堵在用2、

經典基礎C++筆試題2答案

1. C中static有什麼作用?(1)隱藏。 當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性,故使用static在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。(2)static的第二個作用是保持變數內容的持久。儲存在靜態資

Java基礎、Java集合、多執行緒、JDBC、HTTP、JSP、Servlet、Struts試題彙總答案

[Java基礎] 1.”==”和equals方法有什麼區別? 答:==是運算子,equals是方法,方法可以通過重寫改變其行為,如String的equals就是比較字串內容。 2. switch語句能否作用在byte上,能否作用在long上,能否作用在String上?

Android開發工程師試題整理百度

偏簡單部分: 1. Android dvm(Dalvik VM)的程序和Linux的程序,應用程式的程序是否為同一個概念? DVM是Dalvik虛擬機器。每一個Android應用程式都在自己的程序中執行,都擁有一個獨立的Dalvik虛擬機器例項。而每一個Dalvik虛擬機器

大資料試題總結答案

目錄 最近由於要準備面試就開始提早看些面試、筆試題。以下是自己總結的一些經常出現、有價值的試題,包含hadoop、hive、hbase、storm、spark等。答案僅供參考,如有錯誤,請指

Android-BAT試題整理java篇,答案

結尾: 如果你是正在找工作,3分理解7分背,先把offer搞下來再說,知識點太多,全部搞懂不太實際。 如果你還在職,正在物色你喜歡的公司,7分理解3分背,掌握基礎鞏固知識,針對你想進的公司,想進的部門的內容去學習,因為時間比較充裕。 不過無論如何請記住,理解才是王道,所有高深的技術點都是基於基礎知識去延伸的,

springmvc和mybatis試題答案

理解 頁面 發送請求 緩存 固定 sql tor 組件 poj 轉載:http://blog.csdn.net/xinghuo0007/article/details/53463897 Spring MVC Framework有這樣一些特點: 1。它是基於組件技術的.全部的

Java線程試題合集答案

call 獲取鎖 getter 監控 同步方法和同步塊 答案 協調 1.8 標記 來源:Java線程面試題 下面是我自己收集整理的Java線程相關的面試題,可以用它來好好準備面試。 參考文檔: 《Java核心技術 卷一》 Java線程面試題 To

自己實戰整理試題--Mysql答案,不斷更新

mysql目前用的版本? 5.1.21;目前最高5.7.* left join,right join,inner join? left join(左連線) 返回包括左表中的所有記錄和右表中連線欄位相等的記錄  right join(右連線) 返回包括右表中的所有記錄和左

自己實戰整理試題--鎖答案,不斷更新

java有哪些鎖? Synchronized 和 ReentrantLock? 1、synchronized是重量級鎖? 從JDK 1.5 到 JDK 1.6 有一個高效併發方面的重要改進,HotSpot虛擬機器開發團隊在這個版本中花費了很大的精力去對Java中的鎖進行優化(synchr

自己實戰整理試題--JVM答案,不斷更新

jvm記憶體模型,java記憶體模型,GC機制和原理; 物件是否可 GC? GC分哪兩種,Minor GC 和Full GC有什麼區別?什麼時候會觸發Full GC?分別採用什麼演算法? 垃圾回收演算法 垃圾回收器 G1 常見的JVM調優方法有哪些?可以具體到調整哪個引數,調成什麼值? JVM虛