2024最新大廠C++面試真題合集,大廠面試百日沖刺 bay9

騰訊實習

指針常量和常量指針

常量指針(const Type* ptr):指針指向的內容不能被改變,但指針本身可以改變指向。
指針常量(Type* const ptr):指針自身的值即內存地址不能改變,但指向的內存內容可以被改變。

int x/8性能優化

使用位運算進行性能優化,可以將 int x/8 替換為 x >> 3,這樣利用位移操作來代替除法運算。

介紹虛函數及其用法

虛函數是一個在基類中聲明為virtual的函數,它可以在派生類中被重寫,以實現多態。當通過基類的指針或引用調用一個虛函數時,會根據對象的實際類型來調用對應的函數實現,這個過程稱為動態綁定。

為什么構造函數不能是虛函數

構造函數不能被聲明為虛函數,因為虛函數依賴于對象的虛函數表來實現動態綁定,但是當構造函數被調用時,對象正在被構建,虛函數表尚未建立,因此無法調用。另外,構造函數的任務是初始化對象的狀態,而多態是針對已經初始化的對象進行操作的概念,因此將構造函數設為虛函數也沒有意義。

虛函數表占幾個字節

虛函數表的大小取決于編譯器的實現和類的設計。在一般情況下,一個類如果包含虛函數或者繼承了有虛函數的父類,編譯器會為該類的每個對象添加一個虛函數表指針。在大多數32位系統上,一個指針的大小是4字節;在64位系統上,一個指針的大小是8字節。
虛函數表本身是一個指針數組,其大小等于虛函數數量乘以指針的大小。

指針和引用的區別

  • 存儲和使用:指針是一個變量,存儲的是一個地址,可以被重新賦值和修改;引用是一個已存在變量的別名,初始化后就不能重新綁定。

  • 空值:指針可以是nullptr,引用必須綁定到一個合法的對象。

  • 操作符:指針需要解引用操作符 * 來訪問目標對象,引用直接訪問。

  • 地址獲取:可以使用 & 來獲取指針指向的內存地址,對于引用,&得到的是引用所綁定對象的地址。

  • 指針可以有多級(如雙指針、三指針等),但是沒有“多級引用”。

  • C++中構造和析構函數的形參通常使用引用,以避免對象的復制。特別是對拷貝構造函數和賦值操作符,其形參必須是引用。而普通的函數則可以根據需要選擇使用指針或引用。

c++面向對象三大特征

封裝、繼承、多態

vector和quene區別

vector是一個動態數組,支持隨機訪問,可以在任何位置插入和刪除元素,但效率較低(尤其是在頭部)。
queue是一個先入先出(FIFO)的數據結構,只能在隊尾插入,在隊首刪除。
vector對于隨機訪問有很高的效率,但在頭部或中間插入和刪除元素的效率較低。
queue在其兩端操作(入隊和出隊)具有較高的效率,但不支持隨機訪問。

https和http區別

  • 安全性:HTTPS提供了加密傳輸和身份驗證,保障數據在傳輸過程中的安全性,而HTTP傳輸的數據是未加密的,容易被第三方竊取或篡改。
  • 端口:HTTPS默認使用443端口,HTTP默認使用80端口。
  • 性能:由于HTTPS在傳輸數據前需要進行加密,可能會略微影響傳輸效率。然而,隨著技術發展,這種影響正在減小。

https如何實現加密/解密

HTTPS通過SSL/TLS協議實現數據的加密和解密。具體運作過程如下:

  • 密鑰交換:客戶端和服務器之間通過安全握手協議(Secure Sockets Layer Handshake Protocol)交換加密算法和會話密鑰。
  • 數據加密:通過交換的會話密鑰,服務器和客戶端將通信內容進行加密,確保數據的隱私性。
  • 數據解密:收到加密數據的一方使用會話密鑰對數據進行解密,獲取原始信息。
  • 數據完整性:通過消息完整性檢查,驗證數據是否在傳輸過程中被篡改。

數字證書什么作用

  • 身份驗證:證明服務器的身份,避免用戶連接到偽裝的站點。
  • 加密傳輸:提供公鑰,以供客戶端和服務器之間建立安全的加密通信。
  • 數據完整性:確保傳輸的數據沒有被篡改。

如果沒有被授權的證書如何通過驗證

  • 自簽名證書:用戶可以創建自己的證書,并手動將它添加到信任的證書列表中。但是,這種方式的顯著缺點是,在不同設備或用戶之間同步信任列表可能會很困難。
  • 忽略證書錯誤:在一些應用中,可以設置成忽略掉SSL/TLS的證書錯誤。但這樣做將嚴重降低了網絡安全性,使得中間人攻擊成為可能,因此在實際操作中要小心使用。

如何解決線程競爭

解決線程競爭可以通過以下方法:

  • 互斥鎖(Mutex):確保同一時間內只有一個線程可以訪問共享資源。
  • 讀寫鎖(Read-Write Lock):允許多個線程讀共享資源,但寫操作是互斥的。
  • 原子操作:使用原子操作直接對數據進行操作,確保操作的原子性。
  • 信號量(Semaphore):通過計數信號量控制同時訪問資源的線程數。
  • 條件變量(Condition Variable):允許線程在特定條件下等待或發送通知,以避免競爭。

鎖分類有幾種方式

按照功能分類:

  • 互斥鎖(Mutex)
  • 讀寫鎖(Read/Write Locks)
  • 遞歸鎖(Recursive Locks)

按照實現機制分類:

  • 自旋鎖(Spinlock)
  • 阻塞鎖(Blocking Lock)
  • 樂觀鎖/悲觀鎖

按照作用范圍分類:

  • 全局鎖
  • 細粒度鎖

特殊類型的鎖:

  • 條件變量(Condition Variables)
  • 信號量(Semaphore)
  • 讀寫分離鎖(Read-Write Lock)

c++不聲明c語言標準庫會怎么樣

如果在C++代碼中不聲明或引入C語言的標準庫,那么在代碼中就無法使用該庫提供的函數和變量。

為什么要聲明

在 C++ 中聲明 C 語言的標準庫是為了在跨平臺編程過程中復用 C 語言的功能和特性。

怎么查找函數位置有什么區別

查找函數的位置可以通過以下方式:

  • 閱讀文檔:最直接的查找函數位置的方法是查看其官方文檔或參考手冊。
  • 使用IDE:集成開發環境(IDE)通常有內置的搜索功能,可快速找到函數定義。
  • 使用grep:在Linux環境中,可以使用grep工具在文件中搜索文本模式。
  • 使用代碼索引工具:如ctags或Source Insight,這些工具可以在大型項目中快速定位函數定義。

多線程編程過程

多線程編程過程通常包括以下步驟:

  • 創建線程:確定需要多線程執行的任務,并使用相應的API創建線程。
  • 定義線程任務:編寫執行線程功能的代碼塊,定義線程開始執行時要調用的函數或方法。
  • 啟動線程:初始化線程并開始執行定義的任務。
  • 線程同步:使用互斥鎖、信號量等機制同步多個線程間的操作,避免數據沖突。
  • 管理線程生命周期:監控線程的執行狀態,實現線程的暫停、繼續和停止等控制。
  • 線程通信:通過共享內存、消息隊列等方式實現線程間的數據交換和通信。
  • 回收資源:線程任務完成后,回收線程所占用的資源。

tcp三次握手

TCP 的三次握手指的是建立一個 TCP 連接時需要經過的三個步驟:

  • SYN:客戶端發送一個 SYN(同步)包給服務器,請求建立連接,同時發送自己的初始序列號。
  • SYN-ACK:服務器收到 SYN 包后,向客戶端發送一個 SYN-ACK(同步應答)包,確認收到了 SYN 包,同時也發送自己的初始序列號。
  • ACK:客戶端收到 SYN-ACK 包后,再發送一個 ACK(應答)包給服務器,確認收到了服務器的 SYN-ACK 包。至此,連接建立完成。

海康威視應用軟件開發工程師春招

指針和引用的區別

  • 存儲和使用:指針是一個變量,存儲的是一個地址,可以被重新賦值和修改;引用是一個已存在變量的別名,初始化后就不能重新綁定。

  • 空值:指針可以是nullptr,引用必須綁定到一個合法的對象。

  • 操作符:指針需要解引用操作符 * 來訪問目標對象,引用直接訪問。

  • 地址獲取:可以使用 & 來獲取指針指向的內存地址,對于引用,&得到的是引用所綁定對象的地址。

  • 指針可以有多級(如雙指針、三指針等),但是沒有“多級引用”。

  • C++中構造和析構函數的形參通常使用引用,以避免對象的復制。特別是對拷貝構造函數和賦值操作符,其形參必須是引用。而普通的函數則可以根據需要選擇使用指針或引用。

TCP三握四揮的過程

TCP 的“三次握手”和“四次揮手”過程如下:
三次握手(建立連接):

  • SYN: 客戶端發送 SYN 標記的數據包到服務器以初始化一個連接。
  • SYN-ACK: 服務器接收到 SYN 包,回復一個 SYN-ACK 標記的數據包作為應答。
  • ACK: 客戶端再發送一個 ACK 包,確認收到服務器的 SYN-ACK 包,完成連接建立。

四次揮手(斷開連接):

  • FIN: 主動關閉方發送一個 FIN 標記的數據包表示要關閉連接。
  • ACK: 被動關閉方接收到 FIN 包后,發送一個 ACK 包作為應答,并進入 CLOSE_WAIT 狀態。
  • FIN: 被動關閉方準備好關閉連接時,發送一個 FIN 包。
  • ACK: 主動關閉方接收到 FIN 后,回送一個 ACK 包確認,然后進入 TIME_WAIT 狀態。經過一段時間后,確認沒有新的數據要處理,連接完全關閉。

GET和POST的區別

數據傳輸方式:

  • GET: 參數通常附加在 URL 后面,有長度限制,可見。
  • POST: 參數在請求體中,無長度限制,不可見。

安全性:

  • GET: 安全性較低,因為數據在 URL 中可見。
  • POST: 安全性較高,因為數據在請求體中。

可緩存/收藏:

  • GET: 可被緩存,也可被收藏為書簽。
  • POST: 通常不被緩存,也不能收藏為書簽。

功能用途:

  • GET: 適用于請求數據或搜索查詢,URL中保存狀態信息。
  • POST: 適用于提交數據,如表單提交。

冪等性:

  • GET: 冪等,即多次請求相同結果。
  • POST: 非冪等,多次請求可能產生不同的副作用。

雙向鏈表,環形鏈表

  • 雙向鏈表:每個節點有兩個鏈接,一個指向前一個節點,另一個指向后一個節點。這使得從任何方向- 遍歷鏈表變得簡單。
  • 環形鏈表:在這種鏈表中,最后一個節點指向第一個節點或頭節點,形成一個閉環。這使得鏈表從任何節點開始都可以遍歷完整個鏈表。

C++內存管理

C++的內存管理主要有以下幾部分組成:

  • 堆(Heap):程序員手動控制的內存區域,使用 new 分配內存,使用 delete 釋放內存。
  • 棧(Stack):存放局部變量和函數參數的內存區域。變量的分配和銷毀由編譯器自動進行,生命周期隨函數的調用和返回而改變。
  • 靜態/全局區(Static/Global):存放全局變量和靜態變量,由編譯器分配和銷毀,并在程序運行期間始終存在。
  • 常量區: 存放如字符串常量等的內容,只可讀。
  • 代碼區:存放程序代碼(函數體),由操作系統進行管理。

內存池

C++內存池的基本工作原理和步驟是:

  • 首先預先在內存中申請足夠多的內存塊,這些內存塊形成內存池。
  • 當有新的內存請求時,從內存池中分配出一個足夠的內存塊來使用,而不是從系統堆上分配。
  • 當不需要使用的內存返回時,將其放回內存池中,以便以后使用,而不是返回給系統。

高德 C++

const用在哪?

定義常量、修飾函數參數、修飾函數、修飾指針

const & 傳參為什么效率高?

使用const &(常量引用)傳參效率高主要是因為它避免了大型對象的拷貝操作,減少了內存使用和提高了函數調用的速度。

C++容器?

序列式容器:元素按順序排列。

  • vector:動態數組,支持快速隨機訪問。
  • list:雙向鏈表,支持快速插入和刪除。
  • deque:雙端隊列,支持從兩端快速插入和刪除。
  • array(C++11):固定大小數組。
  • forward_list(C++11):單向鏈表。

關聯式容器:基于鍵來存取元素。

  • set:不重復元素集,自動排序。
  • multiset:可以有重復元素的集,自動排序。
  • map:鍵值對集合,根據鍵自動排序。
  • multimap:鍵值對集合,鍵可以重復,根據鍵自動排序。

vector超出容量會怎樣?

當向C++的vector添加元素超出其當前容量時,它會自動進行擴容。通常,這意味著vector將分配一個新的、更大的內存塊,通常是當前容量的兩倍,并將現有元素復制到新的內存塊中,然后釋放舊的內存。

vector擴容基數?

vector擴容的具體基數(或增長因子)依賴于具體的實現,并沒有在C++標準中嚴格規定。常見的擴容基數是當前容量的1.5倍或2倍。擴容后的新容量被稱為vector的capacity。

虛函數表是類還是對象擁有的?

虛函數表是類的一部分,但是每個對象實例都有一個指針指向其所屬類的虛函數表。所以雖然虛函數表是類擁有,但通過對象也能訪問到。

怎么獲取虛函數表?

可以通過對象的虛表指針來獲取虛函數表。這通常涉及到對對象內部布局的直接訪問,不推薦在標準C++代碼中這樣做,因為這種操作是依賴于具體編譯器實現的,不具有可移植性。

map查詢效率?

unordered_map通常提供平均時間復雜度為O(1)的查找性能,而map提供O(log n)的查找性能,因為它是基于紅黑樹實現的。

map的key是自定義的類,需要注意什么?

使用自定義類作為map的鍵時,需要為類實現比較運算符<的重載,才能保證類的對象之間可以進行完全排序比較,這是map紅黑樹底層實現的要求。如果沒有這個操作,編譯器會報錯。

二叉樹遍歷?

二叉樹的主要遍歷方式有三種:
前序遍歷:先訪問根節點,然后遍歷左子樹,最后遍歷右子樹。
中序遍歷:先遍歷左子樹,然后訪問根節點,最后遍歷右子樹。
后序遍歷:先遍歷左子樹,然后遍歷右子樹,最后訪問根節點。

查找算法?

查找算法主要包括線性查找、二分查找、哈希查找以及基于各種樹結構的查找

收集整理了一份2024年最新C++開發學習資料,既有適合小白學習的零基礎資料,也有適合3年以上經驗的小伙伴深入學習提升的進階課程,涵蓋了95%以上C++開發知識點,真正體系化!
包含大廠面經、學習筆記、實戰項目、大綱路線、講解視頻 領取 君羊739729163 或者
https://docs.qq.com/doc/DR2N4d25LRG1leU9Q
網上學習資料一大堆,但如果學到的知識不成體系,遇到問題時只是淺嘗輒止,不再深入研究,那么很難做到真正的技術提升。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11558.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11558.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11558.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

draw.io 網頁版二次開發(1):源碼下載和環境搭建

目錄 一 說明 二 源碼地址以及下載 三 開發環境搭建 1. 前端工程地址 2. 配置開發環境 &#xff08;1&#xff09;安裝 node.js &#xff08;2&#xff09;安裝 serve 服務器 3. 運行 四 最后 一 說明 應公司項目要求&#xff0c;需要對draw.io進行二次開發&…

電商后臺的秘密:通過API接口提取商品信息

在電子商務的運營中&#xff0c;后臺管理是核心環節&#xff0c;而API接口則是高效管理商品信息的關鍵。API允許商家直接與電商平臺的數據庫進行交互&#xff0c;實現數據的自動化提取和更新。 一、電商后臺管理的核心作用 電商后臺管理系統是商家進行商品展示、訂單處理、庫…

存儲過程、觸發器和函數

存儲過程、觸發器和函數在數據庫中具有重要的作用&#xff0c;它們可以帶來以下幾個方面的重要性&#xff1a; 數據一致性和完整性&#xff1a; 觸發器和存儲過程可以用于實現數據一致性和完整性約束。通過在數據庫操作&#xff08;如插入、更新、刪除&#xff09;發生時自動執…

盛最多水的容器(雙指針)

解題思路&#xff1a; 1&#xff0c;暴力解法&#xff08;超時&#xff09; 我們可以使用兩層for循環進行遍歷。找到那個最大的面積即可&#xff0c;這里我就不寫代碼了&#xff0c;因為寫了也是超時。 2&#xff0c;雙指針法 先定義兩個指針一個在最左端&#xff0c;一個在…

C++ 派生類的引入與特性

一 繼承與派生 從上面的例子可以看出&#xff1a; 繼承&#xff1a;一旦指定了某種事物父代的本質特征&#xff0c;那么它的子代將會自動具有哪些性質。這就是一種樸素的可重用的概念。 派生&#xff1a;而且子代可以擁有父代沒有的特性&#xff0c;這是可擴充的概念。 1 C 的…

Today At Apple 2024.04.15 Phone15 入門

官網&#xff1a; https://www.apple.com/today/Apple 亞洲第一大商店&#xff1a;Apple 靜安零售店現已在上海開幕如下預約課程&#xff1a;下載 Apple Store&#xff08;不是app store&#xff09;&#xff0c;點擊課程預約筆記&#xff1a;Today At Apple Notes果粉加群 &am…

Mybatis進階詳細用法

目錄 條件構造器 案例 自定義SQL 案例 Service接口 案例 綜合案例 條件構造器 案例 Testvoid testQueryMapper() {// 創建 QueryWrapper 實例QueryWrapper<User> queryWrapper new QueryWrapper<>();queryWrapper.select("id," "username,&…

uniapp經驗

uniapp-ts模版在前端/vue文件夾下 npx dcloudio/uvmlatest 安裝依賴 之后tsconfig.json會報錯&#xff0c;可以在tsconfig.json文件中"compilerOptions"配置項內添加"ignoreDeprecations": "5.0"&#xff0c;解決。 ### 編譯和運行 uni-app 項目…

Postman基礎功能-變量設置與使用

如果你因失去太陽而流淚&#xff0c;那你也將失去群星了。大家好&#xff0c;在 API 測試的廣袤世界中&#xff0c;Postman 猶如一座閃耀的燈塔&#xff0c;為我們指引著前行的方向。而其中的全局變量、集合變量和環境變量&#xff0c;更是如同隱藏的寶藏&#xff0c;蘊含著巨大…

以太網網絡變壓器型號

Hqst華強盛導讀&#xff1a;以太網網絡變壓器的型號通常由一系列數字和字母組成&#xff0c;其中包括以下信息&#xff1a; 額定電壓&#xff1a;表示變壓器的額定輸入和輸出電壓&#xff0c;通常以伏特&#xff08;V&#xff09;為單位。 額定電流&#xff1a;表示變壓器的額定…

0513_IO7

練習1&#xff1a; 使用消息隊列實現的2個終端之間的互相聊天 并使用信號控制消息隊列的讀取方式&#xff1a; 當鍵盤按ctrlc的時候&#xff0c;切換消息讀取方式&#xff0c;一般情況為讀取指定編號的消息&#xff0c;按ctrlc之后&#xff0c;指定的編號不讀取&#xff0c;讀取…

孩子多大可以接觸python?學習python的好處

孩子接觸Python的年齡并沒有明確的界限&#xff0c;一般來說&#xff0c;6歲以上的孩子可以開始學習Python編程。雖然Python是一門高級編程語言&#xff0c;但它的語法簡單易懂&#xff0c;適合初學者入門。通過學習Python編程&#xff0c;孩子可以培養邏輯思維、創造力和解決問…

電商秒殺系統設計

業務流程 系統架構 系統挑戰 高并發:秒殺活動會在短時間內吸引大量用戶,系統需要能夠處理高峰時期的大量并發請求 庫存同步:在秒殺中,面臨的一個嚴重系統挑戰是如何確保在數以萬計的用戶同時搶購有限的商品時,如何正確、實時地扣減庫存,以防止超賣現象。 防止惡意搶購和…

前端 JS 經典:JS 基礎類型和 typeof

前言&#xff1a;JS 基礎類型就 8 種&#xff0c;這是官方確定的&#xff0c;毋庸置疑。其中原始類型 7 種&#xff0c;對象類型 1 種。而 typeof 關鍵字是用來判斷數據是屬于什么類型的。 1. 原始類型 Number、Boolean、String、BigInt、symbol、Undefined、null typeof 18…

貓頭虎分享已解決Error || ERROR: Failed building wheel for XXX

博主貓頭虎的技術世界 &#x1f31f; 歡迎來到貓頭虎的博客 — 探索技術的無限可能&#xff01; 專欄鏈接&#xff1a; &#x1f517; 精選專欄&#xff1a; 《面試題大全》 — 面試準備的寶典&#xff01;《IDEA開發秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鴻蒙》 …

python設計模式---觀察者模式

觀察者模式是一種行為設計模式&#xff0c;用于定義對象之間的一對多依賴關系&#xff0c;當一個對象的狀態發生變化時&#xff0c;所有依賴它的對象都會得到通知并自動更新。 from abc import ABC, abstractmethod from typing import Listclass Observable:def __init__(sel…

系統定時器(SysTick)

介紹SysTick SysTick結構框圖 時鐘選擇 計數器部分 中斷部分 工作流程 相關寄存器 配置流程 相關庫函數

centos無法tab補全至文件

很奇怪的需求&#xff1a;redhat 7.9版本用cd 只能到目錄&#xff0c;無法到文件 我個人認為不是個問題&#xff0c;但是甲方需求&#xff0c;你懂的 首先&#xff0c;我們要搞清楚tab補全功能的包bash-completion是否安裝&#xff0c;這里肯定是安裝了&#xff0c;不過還是看…

使用vscode時快速生成console.log()

前言&#xff1a;在使用vscode開發進行調試時&#xff0c;我們經常要用到console.log()來調試代碼&#xff0c;有什么好用的辦法來快速生成&#xff0c;答案肯定是有的&#xff0c;下面跟隨我來看一下是不是真的很好用。 安裝插件JavaScript (ES6) code snippets 使用時直接按照…

Python批量輸出圖像的尺寸、格式、模式代碼

import os from PIL import Image # 原始文件夾路徑 original_folder rC:\Users\86182\Desktop\OPENCVyt\yt1 # 遍歷原始文件夾中的圖像 for filename in os.listdir(original_folder): img Image.open(os.path.join(original_folder, filename)) Size img.size # …