C++面試問題匯總


作者:勿忘心安~~
鏈接:https://www.nowcoder.com/discuss/197611
來源:牛客網

1 C++基礎:

 (1)多態是怎么樣的?寫個樣例?

  https://www.cnblogs.com/yichengming/p/11427811.html

 (2)c和c++的區別

  https://www.cnblogs.com/yichengming/p/11427890.html

 (3)什么是虛函數?什么是純虛函數?

  虛函數是允許被其子類重新定義的成員函數

  虛函數的聲明:virtual returntype func(parameter);引入虛函數的目的是為了動態綁定;

  純虛函數聲明:virtual returntype func(parameter)=0;引入純虛函數是為了派生接口。(使派生類僅僅只是繼承函數的接口)

 (4)基類為什么需要虛析構函數?

  防止內存泄漏。假如沒有虛析構函數,釋放一個由基類指針指向的派生類對象時,不會去觸發動態綁定,則只會調用基類的析構函數,不會調用派生類的析構函數。派生類中申請的空間則得不到釋放導致內存泄漏。

 (5)當i是一個整數的時候i++和++i哪個更快?它們的區別是什么?

  考慮內建數據類型時,它們的效率差別不大(去除編譯器優化的影響)。所以在這種情況下我們大可不必關心。
現在讓我們再考慮自定義數據類型(主要是指類)的情況。此時我們不需要再做很多匯編代碼的分析了,因為前綴式(++i)可以返回對象的引用,而后綴式(i++)必須產生一個臨時對象保存更改前對象的值並返回(實現過自定義類型++運算符定義的就知道),所以導致在大對象的時候產生了較大的復制開銷,引起效率降低,因此處理使用者自定義類型(注意不是指內建類型)的時候,應該盡可能的使用前綴式地增/遞減,因為他天生體質較佳。

  此外,++i返回的是對象的引用,是一個可以修改的左值。

 (6)當i是一個整數的時候i++和++i哪個更快?它們的區別是什么?

  reserve()用於讓容器預留空間,避免再次分配內存;capacity()返回在重新進行分配以前所能容納的元素數量。

 (7)如何初始化const和static數據成員

  通常在類外申明static,但是static const的整型(bool,char,int,long)可以在類中聲明且初始化,static const的其他類型必須在類外初始化(包括整型數組)。

 (8)static和const分別怎么用,類里面static和const可以同時修飾成員函數嗎?

  https://www.cnblogs.com/yichengming/p/11428100.html

 (9)指針和引用的區別

本質上的區別是,指針是一個新的變量,只是這個變量存儲的是另一個變量的地址,我們通過訪問這個地址來修改變量。

而引用只是一個別名,還是變量本身。對引用進行的任何操作就是對變量本身進行操作,因此以達到修改變量的目的。

注:

(1)指針:指針是一個變量,只不過這個變量存儲的是一個地址,指向內存的一個存儲單元;而引用跟原來的變量實質上是同一個東西,只不過是原變量的一個別名而已。如:
int a=1;int *p=&a;
int a=1;int &b=a;
上面定義了一個整形變量和一個指針變量p,該指針變量指向a的存儲單元,即p的值是a存儲單元的地址。

而下面2句定義了一個整形變量a和這個整形a的引用b,事實上a和b是同一個東西,在內存占有同一個存儲單元。

(2)可以有const指針,但是沒有const引用(const引用可讀不可改,與綁定對象是否為const無關)

注:引用可以指向常量,也可以指向變量。例如int &a=b,使引用a指向變量b。而為了讓引用指向常量,必須使用常量引用,如const int &a=1; 它代表的是引用a指向一個const int型,這個int型的值不能被改變,而不是引用a的指向不能被改變,因為引用的指向本來就是不可變的,無需加const聲明。即指針存在常量指針int const *p和指針常量int *const p,而引用只存在常量引用int const &a,不存在引用常量int& const a。

(3)指針可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的)

(4)指針的值可以為空,但是引用的值不能為NULL,並且引用在定義的時候必須初始化;

(5)指針的值在初始化后可以改變,即指向其它的存儲單元,而引用在進行初始化后就不會再改變了。

(6)"sizeof引用"得到的是所指向的變量(對象)的大小,而"sizeof指針"得到的是指針本身的大小;

(7)指針和引用的自增(++)運算意義不一樣;

(8)指針使用時需要解引用(*),引用則不需要;

  (9)什么是

  • emplace / empalce_front / emplace_back
  • 面向對象的?面向對象的特性?有什么優點,比面向過程的語言好在哪?
  • C語言是怎么進行函數調用的?
  • C語言參數壓棧順序?
  • C語言如何處理返回值?

2 操作系統

  (1)進程間七大通信方式

    管道(Pipe)、命名管道(Named pipe)、信號(Signal)、消息隊列(Message queue)、共享內存(Shared memory)、套接字(Socket)、信號量(Semaphore)

  https://blog.csdn.net/zhaohong_bo/article/details/89552188

  命名管道和無名管道

  • 堆棧溢出
  • 進程和線程(https://www.cnblogs.com/qianqiannian/p/7010909.html)
  • 守護進程、僵屍進程、孤兒進程,守護進程的作用是什么?
  • · 協程
  • 一個文件被刪除了,沒有被釋放是什么原因呢?
  • 弱類型、強類型、動態類型是什么(https://blog.csdn.net/endlessseaofcrow/article/details/80350347)
  • 自旋鎖(https://baike.baidu.com/item/%E8%87%AA%E6%97%8B%E9%94%81/9137985?fr=aladdin)
  • · OPEN的過程
  • READ的過程
  • WRITE的過程     (https://blog.csdn.net/csu_max/article/details/38623053)
  • 操作系統是如何調度進程呢(https://blog.csdn.net/qq_35642036/article/details/82809812)
  • 消息隊列
  • · malloc函數具體實現原理
  • 死鎖的原因?條件?如何預防?又如何避免?如何解除?

3 TCP網絡

  • 概率題

假設一段公路上,1小時內有汽車經過的概率為96%,那么,30分鍾內有汽車經過的概率為?

  • 字節序與網絡字節序
  • 超時重傳、快速重傳
  • 客戶端服務器通信死鎖如何處理?

1) HTTP協議與TCP/IP協議的關系

2) 如何理解HTTP協議是無狀態的

3)什么是長連接、短連接?

4)TCP協議的長連接和短連接優點和缺點

  • · 什么是MD5?
  • · 阻塞式IO使用場景
  • · 什么是TCP粘包
  • · 拒絕服務攻擊DOS
  • XSS,SQL
  • · HTTPS建立連接的過程
  • 常用的HTTP請求頭與響應頭

HTTP請求頭:

HTTP響應頭:

TCP是如何保證有序傳輸的?

  • · POST可以獲取數據嗎?就是實現GET方法?

4 數據結構與算法:

  • 堆排序和快速排序 or 快排為什么快呢?
  • 哈希表如何設計?需要利用到磁盤空間。
  • STL中hash_map擴容發生什么?

5 數據庫

  

6 其他知識

  • UTF8和GD2312的區別
    • C++多線程對10個文件進行排序


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM