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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C/C++】面经总结和心得分享

發布時間:2024/1/18 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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++】面经总结和心得分享的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。