C++面向對象的常見面試題目(二)

1. 繼承關系下,析構函數和構造函數執行順序?

構造函數按照依賴鏈,從強到弱構造

首先調用基類的構造函數。如果有多個基類,則按照它們在派生類聲明中出現的順序調用;接下來,按照它們在類中聲明的順序,調用派生類中所有非靜態成員變量(包括從基類繼承的成員變量)的構造函數;最后調用派生類自己的構造函數體。這意味著,派生類的構造函數有機會使用已經初始化完畢的基類成員和派生類成員。

析構函數按照依賴鏈,從弱往強進行析構

首先執行派生類的析構函數體;然后按照它們在類中聲明的逆序,調用派生類中所有非靜態成員變量的析構函數;最后調用基類的析構函數;如果有多個基類,同樣按照它們在派生類聲明中逆序調用。

2. 虛函數表和虛函數表指針的創建時機

編譯器發現類中包含 virtual 關鍵字修飾的函數就會創建虛函數表。虛函數表的內容在編譯的時候就已經生成了。虛函數表存儲在全局數據區的只讀數據字段中,虛函數表是存放虛函數的地址的數組。

當一個包含虛函數的類的對象被創建時,編譯器會確保在對象的內存布局中包含一個指向虛函數表的指針,即vptr。vptr的初始化(即賦值為虛函數表的地址)通常發生在對象構造函數執行的過程中。即使沒有顯示定義構造函數,編譯器也會自動生成一個默認構造函數來完成這項任務。

在繼承關系中,調用基類構造函數的時候,先將基類的虛函數表地址賦值給 vptr,接著調用子類構造函數的時候,又將子類的虛函數表地址賦值給 vptr。

3. 虛析構函數的作用

虛析構函數是在C++中,為了實現多態性而在基類中聲明為虛函數的析構函數。

在繼承下,為了使子類析構函數能得到正常調用,需要將基類的析構函數設置為虛析構函數。

設置虛析構函數是有代價的,編譯器會為類生成虛函數表,每個對象都需要持有 vptr

4. 手動管理指針可能出現哪些問題?

野指針:指向了一個未知的、無效的或者未初始化的地址

指針懸掛:釋放了內存但是忘記把指針置空

踩內存:程序在運行過程中發生了越界

沒有釋放資源產生內存泄漏,重復釋放資源引發coredump

5. C++智能指針的原理

unique_ptr:?代表獨占所有權的智能指針。它保證同一時間內只有一個unique_ptr實例擁有指向對象的指針。當unique_ptr離開作用域時,它會自動刪除所擁有的對象,從而釋放內存

shared_ptr: 引用計數,允許多個智能指針共享同一個對象的所有權。它通過引用計數機制工作,即一個控制塊(通常是一個原子計數器)記錄有多少個shared_ptr指向同一塊內存。當最后一個指向該內存的shared_ptr銷毀時,引用計數減至零,此時控制塊會自動釋放這塊內存。

weak_ptr:?一種不增加引用計數的智能指針,它用于非擁有地觀察由一個或多個shared_ptr管理的對象。主要用于解決循環引用的問題,因為weak_ptr不會增加被觀察對象的引用計數,即使持有weak_ptr的實例很多,也不會阻止對象被銷毀。

6. 靜態庫和動態庫的區別

(1)鏈接方式:靜態鏈接把靜態庫編譯到目標文件;動態鏈接沒有把庫編譯到目標文件,而是在程序運行時才去加載代碼

(2)空間占用:靜態庫會存在多個副本,動態庫只有一個副本

(3)使用方式:靜態庫 程序直接運行,動態庫需要根據指定的路徑查找動態庫

(4)執行速度:動態庫執行慢,靜態庫執行速度較快

(5)庫文件發生變更:接口變更都需要重新編譯,接口實現改變如果是動態鏈接只需要重新編譯動態庫。

7. 使用過C++11哪些新特性

新的語法糖:auto, decltype, nullptr, final, override, const, 基于范圍的for循環,function函數對象

?STL容器:vector、list、unordered_ma、unordered_set

智能指針:shared_ptr, weak_ptr, unique_ptr

多線程:thread、mutex、lock_guard、condition_variable、atomic

右值引用:T &&;實現移動語義和完美轉發

8. 左值引用和右值引用的區別?右值引用的意義?

左值可以在等號左邊,能夠取地址,有一個具體的名字,右值只能在等號右邊,不能取地址,不具名。

左值常見例子:變量名,返回左值引用的函數調用,前置自增自減,解引用表達式

右值常見例子:字面值,返回非引用類型的函數調用,后置自增自減,算數表達式,邏輯表達式,比較表達式,將亡值

右值引用的意義:避免資源的復制,實現資源所有權的轉移,在模板編程中,右值引用和模板參數的結合使用可以實現完美轉發(perfect forwarding),允許將函數參數以原始類型(左值或右值)轉發給其他函數。

10. 什么是將亡值?

指的是即將被銷毀的對象。這個概念是在C++11標準中引入的,用于描述那些即將被移動(move)操作所消費的對象。移動操作是一種優化技術,它允許將資源(如內存、文件句柄等)從一個對象轉移到另一個對象,而無需復制這些資源。

這是一條吃飯博客,由挨踢零聲贊助。學C/C++就找挨踢零聲,加入挨踢零聲,面試不挨踢!

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

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

相關文章

windows USB 設備驅動開發-處理批傳輸的靜態流

在 USB 2.0 和更早版本的設備中,批量端點可以通過該端點發送或接收單個數據流。 在 USB 3.0 設備中,批量端點能夠通過該端點發送和接收多個數據流。 Windows 中 Microsoft 提供的 USB 驅動程序堆棧支持多個流。 這使客戶端驅動程序能夠將獨立的 I/O 請求…

GEE代碼實例教程詳解:長時間序列風速分析

簡介 在本篇博客中,我們將使用Google Earth Engine (GEE) 對長時間序列的風速數據進行分析。通過ERA5再分析數據集,我們可以計算2010年至2024年間的平均風速,并與1980年至2020年的風速數據進行比較。 背景知識 ERA5數據集 ERA5是ECMWF&am…

代碼隨想錄-Day53

739. 每日溫度 給定一個整數數組 temperatures ,表示每天的溫度,返回一個數組 answer ,其中 answer[i] 是指對于第 i 天,下一個更高溫度出現在幾天后。如果氣溫在這之后都不會升高,請在該位置用 0 來代替。 示例 1: …

【Linux】目錄的相關命令——cd,pwd,mkdir,rmdir

1.相對路徑與絕對路徑 在開始目錄的切換之前,你必須要先了解一下所謂的路徑(PATH),有趣的是:什么是相對路 與絕對路徑? 絕對路徑:路徑的寫法“一定由根目錄/寫起”,例如:/usr/shar…

Java版Flink使用指南——定制RabbitMQ數據源的序列化器

大綱 新建工程新增依賴數據對象序列化器接入數據源 測試修改Slot個數打包、提交、運行 工程代碼 在《Java版Flink使用指南——從RabbitMQ中隊列中接入消息流》一文中,我們從RabbitMQ隊列中讀取了字符串型數據。如果我們希望讀取的數據被自動化轉換為一個對象&#x…

Linux C++ 043-機房預約系統

Linux C 043-機房預約系統 本節關鍵字:Linux、C、機房預約系統 相關庫函數:for_each、open、close、write 系統簡介 學校現在有幾個規格不同的機房,由于使用經常出現撞車現象,現開發一套機房預約系統,解決這一問題。…

Java進階---抽象方法abstract

抽象方法 案例引入: 在某個寵物店的寵物資源管理系統中有: 狗類:屬性(姓名),行為(吃飯) 貓類:屬性(姓名),行為(吃飯)利用…

智慧科技照亮水利未來:深入剖析智慧水利解決方案如何助力水利行業實現高效、精準、可持續的管理

目錄 一、智慧水利的概念與內涵 二、智慧水利解決方案的核心要素 1. 物聯網技術:構建全面感知網絡 2. 大數據與云計算:實現數據高效處理與存儲 3. GIS與三維可視化:提升決策支持能力 4. 人工智能與機器學習:驅動決策智能化 …

LibreOffice的國內鏡像安裝地址和node.js國內快速下載網站

文章目錄 1、LibreOffice1.1、LibreOffice在application-conf.yml中的配置2、node.js 1、LibreOffice 國內鏡像包網址:https://mirrors.cloud.tencent.com/libreoffice/libreoffice/ 1.1、LibreOffice在application-conf.yml中的配置 jodconverter:local:enable…

Java面試八股之MySQL中int(10)和bigint(10)能存儲讀的數據大小一樣嗎

MySQL中int(10)和bigint(10)能存儲讀的數據大小一樣嗎 在MySQL中,int(10)和bigint(10)的數據存儲能力并不相同,盡管括號內的數字(如10)看起來似乎暗示著某種關聯,但實際上這個數字代表的是顯示寬度,而不是…

vue學習day03-指令修飾符、v-bind對于樣式控制的增強、v-model應用于其他表單元素

7、指令修飾符 (1)概念: 通過“.”指明一些指令后綴,不同后綴封裝了不同的處理操作->簡化代碼 (2)按鍵修飾符 keyup.enter->鍵盤回車監聽 (3)v-model修飾符 v-model.tri…

vue + element ui 實現側邊欄導航欄折疊收起

首頁布局如下 要求點擊按鈕,將側邊欄收縮, 通過 row 和 col 組件&#xff0c;并通過 col 組件的 span 屬性我們就可以自由地組合布局。 折疊前 折疊后 <template><div class"app-layout" :class"{ collapse: app.isFold }"><div class&…

Onekey正版steam分流下載工具

今天給大家介紹的是一款下載steam游戲的工具。Onekey工具&#xff0c;是一款游戲下載器&#xff0c;可以下載steam正版分流游戲。下載正版分流的網站很多&#xff0c;但是都是網盤或者迅雷下載&#xff0c;或者游戲盒子下載&#xff0c;速度都很慢。這款軟件是用steam下載的&am…

Flask項目搭建及部署 —— Python

flask搭建及部署 pip 19.2.3 python 3.7.5 Flask 1.1.1 Flask-SQLAlchemy 2.4.1 Pika 1.1.0 Redis 3.3.11 flask-wtf 0.14.2 1、創建flask項目&#xff1a; 創建完成后整個項目結構樹&#xff1a; app.py: 項?管理?件&#xff0c;通過它管理項?。 static: 存放靜態…

自定義控件視圖篇(一)測量與布局

在自定義控件的開發過程中&#xff0c;"視圖篇"的測量與布局是非常關鍵的步驟&#xff0c;這直接決定了控件的尺寸、位置以及子視圖的排列方式。下面我將詳細介紹測量和布局的過程&#xff0c;以及如何在自定義控件中正確實現這些步驟。 視圖的測量 (onMeasure) 在…

2021版本的idea熱部署的詳細步驟

背景&#xff1a;我是自己用的是2021版本的idea,然后發現跟2023版本的熱部署不太一樣&#xff0c;所以&#xff0c;今天自己出一期這樣的文章吧&#xff01;&#xff01;&#xff01;其他人配置的時候根據自己的情況&#xff0c;來閱讀吧&#xff01; 第一步&#xff1a;方式一…

MyBatis是如何分頁的及原理

MyBatis 是一種持久層框架&#xff0c;支持通過配置文件和注解將 SQL 映射為 Java 對象。在實際開發中&#xff0c;查詢數據時經常需要進行分頁處理。 MyBatis 也提供了支持分頁的方案&#xff0c;其主要思路是使用 Limit 偏移量和限制個數&#xff0c;來獲取指定數量的數據。下…

音視頻入門基礎:H.264專題(10)——FFmpeg源碼中,存放SPS屬性的結構體和解碼SPS的函數分析

一、引言 FFmpeg源碼對AnnexB包裝的H.264碼流解碼過程中&#xff0c;通過ff_h2645_extract_rbsp函數拿到該H.264碼流中的某個NALU的NALU Header RBSP后&#xff08;具體可以參考&#xff1a;《FFmpeg源碼&#xff1a;ff_h2645_extract_rbsp函數分析》&#xff09;&#xff0c…

【沐風老師】3DMAX建筑體塊生成插件BuildingBlocks使用方法詳解

BuildingBlocks建筑體塊生成插件使用方法詳解 聽說你還在手動建配景樓&#xff1f;有了BuildingBlocks這個插件&#xff0c;一分鐘搞定喔&#xff01; 3DMAX建筑體塊生成插件BuildingBlocks&#xff0c;用于快速自定義街道及生成配景樓區塊。 【適用版本】 3dMax2019及更高版…

空間分析在3D應用中的革命:提升投資回報與業務價值

在3D應用的浪潮中&#xff0c;空間分析技術正成為提升用戶體驗、優化業務決策和解決復雜問題的關鍵工具。本文將深入探討空間分析如何通過提供深度用戶行為洞察和數據可視化&#xff0c;增強3D應用的實際效益和市場競爭力。 一、空間分析的概念與背景 Tony Bevilacqua&#x…