【C/C++】面经总结和心得分享
🍎 博客主頁:🌙@披星戴月的賈維斯
🍎 歡迎關注:👍點贊🍃收藏🔥留言
🍇系列專欄:🌙 C/C++專欄
🌙請不要相信勝利就像山坡上的蒲公英一樣唾手可得,但是請相信,世界上總有一些美好值得我們全力以赴,哪怕粉身碎骨!🌙
🍉一起加油,去追尋、去成為更好的自己!
文章目錄
- 前言
- 🍎1、參加模擬面試的心得
- 🍎2、介紹C++所有的構造函數
- 🍎3、結構體內存對齊方式和為什么要進行內存對齊
- 🍎4、C++的智能指針(重點)
- 🍎5、模板的用法與適用場景 實現原理
- 🍎6、知道C++11新特性嗎?
- 🍎7、快排的遞歸和非遞歸實現
- 🍎總結
提示:以下是本篇文章正文內容,下面案例可供參考
前言
????前天,我們總結了C++面經的一部分,我也參加了某平臺的模擬面試,對于面試的要點頗有心得,希望這次能和大家繼續聊聊C++面經這個話題,這是對自己學過的知識的進行的總結,也希望能對大家有所幫助!
🍎1、參加模擬面試的心得
????首先,有一個扎實的基礎是一張王牌,所以我們要努力學習,少偷懶。面試會考的幾個點:C/C++的基礎知識, 網絡部分,Linux基礎,操作系統,算法。這5個點考察的都會比較深,我們一定要理解充分這些要點,如果在面試中遇到不會的點,大大方方和面試官說,不要不懂裝懂。C/C++這塊常問智能指針,new/delete,面向對象三大特性,特別是多態這個要點;網絡部分重中之中是tcp/udp,http/https,tcp的三次握手等等,Linux基礎知識可能會考一些基礎操作,解壓縮,管道之類的,操作系統部分可能考進程,線程,鎖,虛擬內存等等,算法可能考排序,DFS,動態規劃,貪心,等等。
🍎2、介紹C++所有的構造函數
C++構造函數主要有默認構造、重載構造函數和拷貝構造函數。
默認構造是當類沒有實現自己的構造函數的時候,編譯器默認提供的一個構造函數。
重載構造函數也被稱為一般構造函數,一個類可以有多個重載構造函數,但是需要他們的參數列表不相同。
拷貝構造函數是在發生對象賦值的時候調用的,其參數是一個對象,并且必須是引用或者指針,不能是對象本身。
🍇什么情況下會調用拷貝構造函數?
-
1.對象以值傳遞的方式傳入函數參數。
-
2.對象以值傳遞的方式從函數返回,會拷貝返回一個臨時對象,然后用臨時對象去給外面接收的對象賦值。
-
3.對象需要調用另一個對象進行初始化。這個和第一條有點像。
🍎3、結構體內存對齊方式和為什么要進行內存對齊
因為結構體的成員可以有不同類型的數據,這些數據所占的內存空間大小也不一樣。同時,CPU又是按塊讀取內存的,內存對齊可以讓CPU一次就將需要的數據獨取出來。否則,CPU就需要多次多去了。
內存對齊的規則:
- 第一個成員在結構體中的偏移量為0
- 其他成員變量要按照對齊數的整數倍地址存放
- 對齊數=min(編譯器默認對齊數,該成員對齊數),在Linux中是4,vs中是8
- 結構體的總大小為最大對齊數的整數倍
🍎4、C++的智能指針(重點)
C++的智能指針有auto_ptr,shared_ptr,weak_ptr和unique_ptr。這四種只能指針都是通過RAII機制(利用對象生命周期來控制程序資源)。也就是說智能指針是一個“對象”,利用智能指針“對象”的生命周期,來控制管理的資源,當智能指針生命周期到了以后,就會在析構函數中delete掉刪除的對象。
- auto_ptr是比較早的智能指針,在進行指針拷貝和賦值的時候,新指針會直接接管舊指針的資源,也就是說,舊指針會直接被置為nullptr,后續如果需要訪問舊指針的資源時就會出現問題,可能會出現同一塊空間析構兩次的尷尬場面。
- unique_ptr是auto_ptr的改良版,不能夠拷貝也不能賦值,保證一個對象對應一個指針。
- shared_ptr采用引用計數,使得一個對象可以有多個智能指針,當計數為0時說明該資源已經沒有指針指向了,可以釋放資源了。但是shared_ptr如果作為類的成員變量的話,容易出現循環引用的問題。比如類Obj中有一個指向自己的shared_ptr指針,兩個對象a和b,他們的shared_ptr互相指向對方,這就會出現循環引用的問題。
- weak_ptr是為了解決shared_ptr而出現的,他沒有RAII機制,沒有引用計數。在使用weak_ptr指向的對象前,需要確定這個對象有沒有被釋放,此時可以調用weak_ptr的clock()成員函數來將其提升成shared_ptr指針,如果對象被釋放了,此次提升就會返回nullptr。
特別注意:shared_ptr不是線程安全的,它只保證引用計數是線程安全的,并不能保證管理對象的讀寫是線程安全的。
unique_ptr不能進行拷貝,那如何進行資源轉移呢?
unique_ptr不允許對左值進行拷貝,但是支持對右值資源的轉移。
🍎5、模板的用法與適用場景 實現原理
模板是用template關鍵字進行聲明。
編譯器會對函數編譯器模板進行兩次編譯:
🍎6、知道C++11新特性嗎?
- 自動類型推導auto:auto聲明的變量必須馬上初始化,編譯器根據初始化的值推導出它的類型。
- nullptr:nullptr關鍵字是為了解決NULL的二義性問題而引進的新的類型,因為在C++中NULL實際上代表的是0,在C語言中是void * 的指針,因為C++不能把void * 類型的指針隱式轉化成其他類型的指針,為了避免二義性則將其改為了0。而nullptr沒有實際的類型名稱,所以可以用來表示空指針。
- lambda表達式:lambda表達式會自動被編譯器處理成一個仿函數并重載()。
- thread線程庫和mutex鎖
- 智能指針
🍎7、快排的遞歸和非遞歸實現
🍇快排的遞歸實現
int PartSort(int* a, int left, int right) {int keyi = left;//key設置成最左邊的數while (left < right){//右邊找小while (left < right && a[right] >= a[keyi])--right;//左邊找大while (left < right && a[left] > a[keyi])//找大++left;Swap(&a[left], &a[right]);}Swap(&a[keyi], &a[left]);return left; } void QuickSort(int* a, int begin, int end) {//子區間相等只有一個值或者不存在那么就是遞歸結束的子問題if (begin >= end)return;int keyi = PartSort(a, begin, end);// [begin, keyi - 1]keyi[keyi + 1, end]QuickSort(a, begin, keyi - 1);QuickSort(a, keyi + 1, end); }🍇快排的非遞歸實現(依靠棧)
快排的非遞歸寫法 void QuickSort5(int* a, int begin, int end) {ST st;StackInit(&st);//入棧StackPush(&st, begin);StackPush(&st, end);//棧是后進先出while (!StackEmpty(&st)){int right = StackTop(&st);StackPop(&st);int left = StackTop(&st);StackPop(&st);int keyi = PartSort3(a, left, right);//[left, keyi - 1][keyi + 1, right]if (left < keyi - 1)//還要繼續入棧的條件{StackPush(&st, left);StackPush(&st, keyi - 1);}if (keyi + 1 < right){StackPush(&st, keyi + 1);StackPush(&st, right);}}StackDestory(&st); }PartSort3 //前后指針法 int PartSort3(int* a, int left, int right) {int mini = Getmini(a, left, right);Swap(&a[mini], &a[left]);int keyi = left;//如果是a[left],則是局部變量,SWap后還是原來的值//left則是下標int prev = left, cur = left + 1;while (cur <= right){if (a[cur] < a[keyi] && a[++prev] != a[cur])Swap(&a[prev], &a[cur]);++cur;}Swap(&a[prev], &a[keyi]);return prev; }🍎總結
????本文向大家介紹了幾個C/C++面試中可能會被問到的問題,以及自己的一些面試心得,希望對讀者能有所幫助!
總結
以上是生活随笔為你收集整理的【C/C++】面经总结和心得分享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 讯飞语音 - 贾维斯
- 下一篇: 35_DMA基本原理