C++面試干貨---帶你梳理常考的面試題(一)

顧得泉:個人主頁

個人專欄:《Linux操作系統》?《C++從入門到精通》??《LeedCode刷題》

鍵盤敲爛,年薪百萬!


1.C和C++的區別

???????1.語法和特性:C是一種過程式編程語言,而C++是一種面向對象編程語言。C++在C的基礎上增加了許多新的語法和特性,如類、對象、繼承、多態等,使得代碼更加模塊化和可重用。

???????2.擴展性:C++可以使用C的代碼,因為C++是C的超集,但C不能使用C++的代碼。C++還提供了許多新的庫和功能,使得開發更加方便和高效。

???????3.內存管理:C++引入了自動內存管理的概念,通過構造函數和析構函數來管理對象的生命周期。而C需要手動管理內存,使用malloc和free等函數進行內存分配和釋放。

???????4.異常處理:C++支持異常處理機制,可以捕獲和處理程序運行過程中的異常情況。而C沒有內置的異常處理機制,需要通過返回錯誤碼或者使用全局變量來處理異常情況。

???????5.標準庫:C++標準庫提供了豐富的功能和數據結構,如容器、算法、字符串處理等。而C的標準庫相對較小,主要包含了一些基本的輸入輸出函數和數學函數。


2.指針和引用的區別

???????1.定義方式:指針是一個變量,存儲的是另一個變量的內存地址,通過使用"*“來聲明和操作指針。引用是一個別名,它直接綁定到另一個變量,通過使用”&"來聲明和操作引用。

???????2.空值:指針可以為空,即指向空地址或者未初始化的指針。而引用必須在定義時初始化,并且不能為空。

???????3.內存操作:指針可以通過解引用操作符"*"來訪問所指向的內存地址中的值。而引用則直接訪問所綁定變量的值,無需解引用。

???????4.重新賦值:指針可以被重新賦值,可以指向不同的內存地址。而引用一旦綁定到一個變量,就不能再綁定到其他變量。

???????5.空間占用:指針需要占用額外的內存空間來存儲地址信息。而引用不需要額外的內存空間,它只是原變量的別名。

???????5.函數參數傳遞:指針可以作為函數參數傳遞,通過傳遞地址來實現對實參的修改。而引用也可以作為函數參數傳遞,通過引用傳遞來實現對實參的修改。


3.malloc和new的區別

共同點

? ? ? ?都是從堆上申請空間,并且需要用戶手動釋放

不同點

? ? ? ?1.malloc是函數,new是操作符

? ? ? ?2.malloc申請的空間不會初始化,new可以初始化

? ? ? ?3.malloc申請空間時,需要手動計算空間大小并傳遞,new只需在其后跟上空間的類型即可,如果是多個對象,[]中指定對象個數即可

? ? ? ?4.malloc的返回值為void*, 在使用時必須強轉,new不需要,因為new后跟的是空間的類型

? ? ? ?5.malloc申請空間失敗時,返回的是NULL,因此使用時必須判空,new不需要,但是new需要捕獲異常

? ? ? ?6.申請自定義類型對象時,malloc/free只會開辟空間,不會調用構造函數與析構函數,而new在申請空間后會調用構造函數完成對象的初始化,delete在釋放空間前會調用析構函數完成空間中資源的清理


4.delete 和 delete[] 的區別

???????1.delete用于釋放通過new運算分配的單個對象的內存,而delete[]用于釋放通過new[]運算符分配的數組對象的內存。

???????2.delete只能釋放通過new運算符分配的單個對象的內存,而不能釋放通過new[]運算符分配的數組對象的內存。同樣,delete[]只能釋放通過new[]運算符分配的數組對象的內存,而不能釋放通過new運算符分配的單個對象的內存。

???????3.delete會調用被刪除對象的析構函數,以確保對象被正確地清理和銷毀。而delete[]會調用數組中每個元素的析構函數,然后再釋放整個數組的內存。

???????4.如果使用delete來釋放通過new[]分配的數組對象的內存,會導致未定義行為。同樣,如果使用delete[]來釋放通過new分配的單個對象的內存,也會導致未定義行為。


5.八大排序的時間復雜度

冒泡排序:

????????最好情況時間復雜度:O(n),當輸入數據已經有序時。

????????最壞情況時間復雜度:O(n^2),當輸入數據逆序時。

????????平均情況時間復雜度:O(n^2)。

選擇排序:

????????最好情況時間復雜度:O(n^2)。

????????最壞情況時間復雜度:O(n^2)。

????????平均情況時間復雜度:O(n^2)。

插入排序:

????????最好情況時間復雜度:O(n),當輸入數據已經有序時。

????????最壞情況時間復雜度:O(n^2),當輸入數據逆序時。

????????平均情況時間復雜度:O(n^2)。

希爾排序:

????????最好情況時間復雜度:O(n log n)。

????????最壞情況時間復雜度:取決于步長序列的選擇,最壞情況下為O(n^2)。

????????平均情況時間復雜度:取決于步長序列的選擇,一般為O(n log n)。

歸并排序:

????????最好情況時間復雜度:O(n log n)。

????????最壞情況時間復雜度:O(n log n)。

????????平均情況時間復雜度:O(n log n)。

快速排序:

????????最好情況時間復雜度:O(n log n),當每次劃分都能均勻地將數組分成兩部分時。

????????最壞情況時間復雜度:O(n^2),當輸入數據已經有序時。

????????平均情況時間復雜度:O(n log n)。

堆排序:

????????最好情況時間復雜度:O(n log n)。

????????最壞情況時間復雜度:O(n log n)。

????????平均情況時間復雜度:O(n log n)。

計數排序:

????????最好情況時間復雜度:O(n + k),其中k是輸入數據的范圍。

????????最壞情況時間復雜度:O(n + k)。

????????平均情況時間復雜度:O(n + k)。


6.const用法

???????1.聲明常量:可以使用const關鍵字聲明一個常量,一旦被聲明為常量,其值就不能再被修改。

例如:

const int MAX_VALUE = 100; 

???????在這個例子中,MAX_VALUE被聲明為一個常量,其值為100,不能再被修改。

???????2.修飾函數參數:const可以用來修飾函數的參數,表示該參數在函數內部不會被修改。這樣做可以增加代碼的可讀性,并且可以防止意外修改參數的值。

???????例如:

void print(const int num);

????????在這個例子中,print函數的參數num被聲明為const,表示在函數內部不會修改num的值。

???????3.修飾成員函數:const可以用來修飾類的成員函數,表示該成員函數不會修改類的成員變量。這樣做可以使得對象在調用該成員函數時不會被修改。

???????例如:

 class MyClass 
{ int num; 
public: int getNum() const; 
};

???????在這個例子中,getNum函數被聲明為const,表示該函數不會修改類的成員變量num。

???????4.修飾指針:const可以用來修飾指針,表示指針所指向的值不能被修改。

有兩種情況:

????????const修飾指針本身:表示指針本身的值不能被修改。例如:const int* p;

????????const修飾指針所指向的值:表示指針所指向的值不能被修改。例如:int* const p;


7.什么是野指針

???????野指針是指指向無效內存地址的指針。一個指針被賦值為一個未初始化的變量、已經釋放的內存地址或者超出作用域的局部變量的地址時,就會產生野指針。野指針的存在可能導致程序崩潰、數據損壞或者安全漏洞。

野指針通常出現在以下情況下:

???????1.指針未初始化:在定義指針變量后,沒有為其分配有效的內存空間。

???????2.指針指向已釋放的內存:在釋放了某個內存塊后,仍然保留了指向該內存塊的指針。

???????3.指針超出作用域:在函數或代碼塊結束后,指針仍然存在并被使用。

為了避免野指針的問題,我們可以采取以下幾種措施:

???????1.初始化指針:在定義指針變量時,將其初始化為nullptr或者有效的內存地址。

???????2.及時釋放內存:在使用完動態分配的內存后,及時使用delete或者free函數釋放內存,并將指針置為nullptr。

???????3.避免指針超出作用域:確保指針的生命周期與其所指向的對象的生命周期相匹配。


8.sizeof 和 strlen 的區別

???????sizeof是一個運算符,用于計算數據類型或變量所占用的字節數。它可以用于任何數據類型,包括基本數據類型(如int、float等)和自定義數據類型(如結構體、數組等)。sizeof返回的是一個無符號整數值,表示所占用的字節數。

???????strlen是一個函數,用于計算字符串的長度,即字符串中字符的個數(不包括字符串末尾的空字符’\0’)。它只能用于字符串類型(即以’\0’結尾的字符數組),不能用于其他數據類型。

區別:

???????參數類型:sizeof可以接受任何數據類型或變量作為參數,而strlen只能接受字符串類型的參數。

???????返回值類型:sizeof返回的是一個無符號整數值,表示所占用的字節數;strlen返回的是一個整數值,表示字符串中字符的個數。

???????計算方式:sizeof在編譯時進行計算,而strlen在運行時遍歷字符串來計算長度。

???????適用范圍:sizeof適用于計算任何數據類型或變量的大小;strlen適用于計算以’\0’結尾的字符串的長度。


9.什么叫做結構體對齊

???????結構體對齊是指在內存中如何排列結構體的成員變量,以便于提高訪問效率和節省內存空間。在結構體中,成員變量的排列順序和對齊方式是由編譯器決定的。

???????結構體對齊的原則是,結構體的起始地址必須是其最寬基本類型成員大小的整數倍。這樣可以保證結構體的每個成員變量都能夠被正確地訪問到,而不會出現對齊錯誤導致的訪問異常或性能下降。

對于結構體的對齊方式,一般有兩種常見的方式:

???????1.默認對齊方式:按照成員變量的定義順序依次排列,每個成員變量按照其自身大小進行對齊。

???????2.指定對齊方式:可以使用編譯器提供的特定語法來指定結構體的對齊方式,例如使用#pragma pack(n)來指定對齊字節數。

???????需要注意的是,結構體對齊可能會導致內存空間的浪費。因為為了滿足對齊要求,編譯器可能會在結構體成員之間插入一些填充字節,以保證對齊。為了減少內存浪費,可以通過調整結構體成員的順序或者使用特定的對齊方式來優化結構體對齊


10.strcpy和memcpy的區別

功能不同:

???????strcpy函數用于將一個字符串(以’\0’結尾)從源地址復制到目標地址,包括字符串的結束符。

???????memcpy函數用于將一段內存塊從源地址復制到目標地址,不關心內存塊的內容是否是字符串。

參數不同:

???????strcpy函數接受兩個參數,分別是目標地址和源地址的指針。

???????memcpy函數接受三個參數,分別是目標地址、源地址和要復制的字節數。

安全性不同:

???????strcpy函數在復制字符串時不會檢查目標地址的空間是否足夠,容易導致緩沖區溢出的安全問題。

???????memcpy函數需要指定要復制的字節數,可以確保不會發生緩沖區溢出。

返回值不同:

???????strcpy函數返回目標地址的指針,即復制后的字符串的起始地址。

???????memcpy函數沒有返回值。

適用場景不同:

???????strcpy函數適用于字符串的復制操作,常用于處理以’\0’結尾的字符串。

???????memcpy函數適用于任意內存塊的復制操作,可以復制任意類型的數據。


?結語:關于本次常見面試題的梳理到這里就結束了,希望本篇文章的分享會對大家的面試帶來些許幫助,如果大家有什么問題,歡迎大家在評論區留言,最后祝愿每位伙伴都能找到心意的工作。

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

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

相關文章

Java智慧云HIS醫院信息化系統源碼 更具靈活性、擴展性

目錄 什么是云HIS 趨勢與轉變 HIS上云后有哪些好處 解決方案 云HIS組成 1、門診掛號 2、住院管理 3、電子病歷 4、藥物管理 5、統計報表 6、綜合維護 7、運營運維 什么是云HIS 云HIS是一種基于云計算技術的醫院信息管理系統。云HIS可以幫助醫院管理各類醫院信息&a…

CIE-Alevel-Physics分類真題下載(更新中)

鏈接真題歸類年份https://www.savemyexams.com/https://gceguide.com/papershttps://pastpapers.papacambridge.com/https://rocketrevise.comhttps://www.exam-mate.com/markhint.inhttps://xtremepape.rs/threads/as-and-a-level-physics-topical-pastpapers-upto-2015-with-…

Java Linux基本命令面試題

Java Linux基本命令面試題 前言1、查看文件內容有哪些命令可以使用?2、終端是哪個文件夾下的哪個文件?黑洞文件是哪個文件夾下的哪個命令?3、用什么命令對一個文件的內容進行統計?(行號、單詞數、字節數)4、怎么使一個命令在后臺運…

每日OJ題_分治歸并②_力扣LCR 170. 交易逆序對的總數

目錄 力扣LCR 170. 交易逆序對的總數 解析代碼1 解析代碼2 力扣LCR 170. 交易逆序對的總數 LCR 170. 交易逆序對的總數 難度 困難 在股票交易中,如果前一天的股價高于后一天的股價,則可以認為存在一個「交易逆序對」。請設計一個程序,輸…

Linux系統中安裝redis+redis后臺啟動+常見相關配置

1、下載Redis Redis官網:https://redis.io/ 歷史版本: http://download.redis.io/releases 2、連接Linux(或者VMwear) 我們安裝的是linux版本的redis 打開xftp我們需要先將我們的Redis上傳到服務器上 解壓到這里 解壓的指令 …

創建型模式之建造者模式

一、概述 1、建造者模式:將一個復雜對象的構建和它的表示分離,使得同樣的構建過程可以創建不同的表示 2、將客戶端與包含多個部件的復雜對象的創建過程分離,客戶端無須知道復雜對象的內部組成部分與裝配方式,只需要知道所需建造…

Spring MVC源碼中設計模式——適配器模式

適配器模式介紹 適配器模式(Adapter Pattern)是作為兩個不兼容的接口之間的橋梁。這種類型的設計模式屬于結構型模式,它結合了兩個獨立接口的功能。 應用場景: 1、系統需要使用現有的類,而此類的接口不符合系統的需要…

[c++] 繼承和多態整理一

1 private 和 protected 繼承,子類指針不能賦值給父類指針 如下代碼,有一個基類 Base,Derived1,Derived2,Derived3 3 個子類繼承了基類 Base,分別是 private 繼承,protected 繼承,p…

基于springboot+vue的紡織品企業財務管理系統

博主主頁:貓頭鷹源碼 博主簡介:Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰,歡迎高校老師\講師\同行交流合作 ?主要內容:畢業設計(Javaweb項目|小程序|Pyt…

Socket網絡編程(五)——TCP數據發送與接收并行

目錄 主要實現需求TCP 服務端收發并行重構啟動main方法重構重構分離收發消息的操作重構接收消息的操作重構發送消息TCPServer調用發送消息的邏輯監聽客戶端鏈接邏輯重構Socket、流的退出與關閉 TCP 客戶端收發并行重構客戶端 main函數重構客戶端接收消息重構客戶端發送消息重構…

前端封裝通用下載方法及下載后端返回的文件流

目錄 1.下載方法封裝 2.將后端返回的文件流轉換為文件 3.總結 1.下載方法封裝 ①說明 前端的請求大概分為三種類型 普通請求:常用的get,post,put,delete等請求 上傳請求:使用post請求,發送formdata對…

Zookeeper學習1:概述、安裝、應用場景、集群配置

文章目錄 概述安裝LinuxWindows 配置參數集群參考配置文件配置步驟流程啟動 概述 Zookeeper: 為分布式框架組件提供協調服務的中間件 【類似:文件系統通知機制】 負責存儲上下層應用關系的數據以及接收觀察者注冊監聽,一旦觀察查關心的數據發…

git操作基本指令

1.查看用戶名 git config user.name 2.查看密碼 git config user.password 3.查看郵箱 git config user.email 4.修改用戶名 git config --global user.name "xxx(新用戶名)" 5.修改密碼 git config --global user.password "xxx(新密碼)" 6.修改…

筆記73:ROS中的各種消息包

參考視頻: 33.ROS 的標準消息包 std_msgs_嗶哩嗶哩_bilibili 34. ROS 中的幾何包 geometry_msgs 和 傳感器包 sensor_msgs_嗶哩嗶哩_bilibili 標準消息包:std_msgs常用消息包:common_msgs導航消息包:nav_msgs幾何消息包&#xf…

實戰分享:Tomcat打破雙親委派模型,實現Web應用獨立與安全隔離的奧秘

目錄 一、JVM 類加載機制 二、Tomcat 類加載器 2.2 findClass 介紹 3.2 loadClass 介紹 三、web應用隔離 3.1 Spring 加載問題 在開始文章內容之前,先來看三個問題 假如在 Tomcat 上運行了兩個 Web 應用程序,兩個 web 應用中有同名的Servlet&#xf…

C++數據結構與算法——二叉樹的屬性

C第二階段——數據結構和算法,之前學過一點點數據結構,當時是基于Python來學習的,現在基于C查漏補缺,尤其是樹的部分。這一部分計劃一個月,主要利用代碼隨想錄來學習,刷題使用力扣網站,不定時更…

AGI概念與實現

AGI AGI(Artificial General Intelligence),中文名為“通用人工智能”或“強人工智能”,是指通過機器學習和數據分析等技術,使計算機具有類似于人類的認知和學習能力的技術. 多模態的大模型 (Multimodal…

詳細介紹如何用windows自帶Hyper-V安裝虛擬機(windows11和ubuntu22)

通過系統自帶的hyper-v安裝windows11,舒服又愜意,相比用第三方虛擬機軟件速度快很多。 硬件準備 準備 系統需要符合能安裝 Hyper-V 的最低要求windows版本含Hyper-V的功能 電腦空間 電腦要有足夠的空間來安裝你這個虛擬機。根據自己的磁盤容量情況來規…

2673. 使二叉樹所有路徑值相等的最小代價

給你一個整數 n 表示一棵 滿二叉樹 里面節點的數目,節點編號從 1 到 n 。根節點編號為 1 ,樹中每個非葉子節點 i 都有兩個孩子,分別是左孩子 2 * i 和右孩子 2 * i 1 。 樹中每個節點都有一個值,用下標從 0 開始、長度為 n 的整…

CloudCanal x Hive 構建高效的實時數倉

簡述 CloudCanal 最近對于全周期數據流動進行了初步探索,打通了Hive 目標端的實時同步,為實時數倉的構建提供了支持,這篇文章簡要做下分享。 基于臨時表的增量合并方式基于 HDFS 文件寫入方式臨時表統一 Schema任務級的臨時表 基于臨時表的…