C++ 初階總復習 (16~30)

C++ 初階總復習 (16~30)

    • 目的
      • 16. 2009. volatile關鍵字的作用
      • 17. 2010.什么是多態 簡單介紹下C++的多態
      • 18. 2011. 什么是虛函數 介紹下C++中虛函數的原理
      • 19. 2012 構造函數可以是虛函數嘛
      • 20. 2013.析構函數一定要是虛函數嘛?
      • 21. 2015. 什么是C++中的虛繼承
      • 22. 2016. 什么是C++函數重載 它的優點是什么 和重寫有什么區別
      • 23. 2017.什么是C++的重載運算符
      • 24. C++中struct和class的區別
      • 25. 2021. C++中enum和enum class的區別
      • 26. 2022. C++中new和malloc的區別 free和delete的區別
      • 27. 2023.C++中this指針的作用
      • 28. 2024. 可以使用delete this嘛
      • 29. 2025. C++中memcpy和memmove有什么區別
      • 30. 2036. C++中使用模塊的優缺點

目的

寫這一系列文章的目的主要是為了秋招時候應對計算機基礎問題能夠流暢的回答出來 (如果不整理下 磕磕絆絆的回答會被認為是不熟悉)

本文章題目的主要來源來自于 面試鴨
部分面試鴨上沒有而牛客網上有的博主會進行查缺補漏

題目編號按照面試鴨官網題號方便大家尋找

題解大部分是博主根據自己之前的博客再加上部分網上的內容進行口語化的表述 如果涉及到省略的部分博主會提供自己或者其他人的博客鏈接

題目會按照由簡單到難進行更新

16. 2009. volatile關鍵字的作用

回答


volatile關鍵字的作用是保持內存的可見性

比如說有這么一段代碼 int a = 0

但是后面沒有對于a進行修改的操作了 那么編譯器就會認為 a 的值就是 0 將他放到寄存器中 而不用內存中的數值

但是如果在別的文件中使用了extern 修改了a的值 那么這時候程序就會出錯了

17. 2010.什么是多態 簡單介紹下C++的多態

參考博客

C++多態

回答


多態就是函數調用的多種形式 使用多態能夠使得不同的對象去完成同一件事時 產生不同的動作和結果

在C++中多態有兩種形式 一種是靜態多態 一種是動態多態

靜態多態在C++中的表現形式是函數重載

動態多態在C++中的表現形式是虛函數+繼承

18. 2011. 什么是虛函數 介紹下C++中虛函數的原理

參考博客

多態原理


虛函數就是被virtual關鍵字修飾的函數

我們可以做個試驗 一個類中有一個int類型的數據的時候 我們使用sizeof計算對象的大小 可以發現對象的大小是4 (類中的函數是存放在公共區域的 不計入對象的大小)

可以如果我們函數中有一個虛函數 那么這個對象的大小就會變為8 多出了四個字節 這是為什么呢?

這里其實是因為有了虛函數中對象中就會多出一個虛函數指針 (相同的類共用一個虛函數指針)

這個虛函數指針指向一個叫做虛表的東西 虛表里面存放著虛函數的地址 我們通過虛表找到函數地址來調用函數

而父類和子類的虛函數指針不同 指向的虛表也不同 所以說這也就是為什么動態多態在原理層面叫做覆蓋的原因


虛表是什么階段初始化的 存放在哪里?

虛表是構造函數列表初始化階段初始化的 它和普通函數一樣 都存放在代碼段

為什么對象不能構成多態

因為我們在使用指針和引用的時候 會發生一種叫做切片的過程 本質上得到是子類從父類那里派生過去的一部分 這個時候父類還是用的父類的虛指針和虛表 子類同理

但是對象的話我們就是直接拷貝了 本質上是同一個類 同一個虛函數 自然不構成多態

靜態多態和動態多態的時機

靜態多態發生在編譯階段 動態多態發生在運行階段

19. 2012 構造函數可以是虛函數嘛

參考博客同上

回答


不行 因為虛函數表生成的時機是在構造函數列表初始化的時候 如果構造函數變成了虛函數 這不就變成了先有雞還是先有蛋的問題了嘛

20. 2013.析構函數一定要是虛函數嘛?

參考博客同上

回答


析構函數不一定是虛函數 但是析構函數我們推薦設置為虛函數

主要是為了應對這種情況

兩個父類的指針一個指向子類一個指向父類

當我們調用析構函數的時候 如果說沒有寫成虛函數 那么就會調用兩次父類的析構函數 造成內存泄漏的情況

析構函數的名字會被統一處理成destructor();

21. 2015. 什么是C++中的虛繼承

參考博客 繼承概念詳解

回答


虛繼承主要是為了解決C++中 多繼承時的菱形繼承的問題

比如說學生類和老師類繼承于人類 然后用戶類繼承于學生類和老師類

但是由于學生類和老師類都繼承了人類中姓名 那么我們使用用戶類調用姓名這個參數的時候 到底是調用的哪個? (當然 這個能通過限定作用域的方式來解決)

此時我們使用學生類和老師類虛繼承人類 就不會發生這個問題了


虛繼承解決二義性問題的原理是什么?

當我們使用虛繼承的時候 原來存放姓名變量的兩個地方會變成存放一個指針 該指針指向一個地址 就是如今存放姓名這個變量的地址 如此就不會出現二義性的問題了

22. 2016. 什么是C++函數重載 它的優點是什么 和重寫有什么區別

C++函數重載就是函數參數個數不同 類型不同 順序不用的函數 在傳入不同參數的時候會發生不同的效果

它也被稱為靜態多態

原理就是C++編譯器將函數和參數作為一個函數的鏈接符號 而C語言只考慮函數名

它的優點是 增強代碼的可讀性 我們為了實現不同的效果去使用不同的函數名

它和重寫的區別是

  1. 一個是編譯期間就確定 一個是運行時才確定
  2. 一個必須要求在父類和子類中 一個不用
  3. 重載要求參數不同 而重寫要求參數相同 (協變除外)

什么是協變

父類和子類的返回值要構成多態理論上必須相同 但是有一種特殊情況

協變

協變的返回值必須是基類或者派生類的指針或引用

23. 2017.什么是C++的重載運算符

參考博客

C++重載運算符


對于一些運算符進行重載 比如說我們寫一個日期類 日期類的++我們就可以重載為天數加一這種形式

不過有五個運算符不能被修改

.* :: sizeof ?: . (第一個基本上遇不到,第二個到第五個解釋:域作用限定符、sizeof、選擇、成員對象結構體訪問符號)

24. C++中struct和class的區別

參考博客
類和對象詳解


  1. 為了兼容C語言 struct可以定義結構體 class不可以
  2. 為了兼容C語言 struct的默認訪問符號為public 而class的默認訪問符為private

25. 2021. C++中enum和enum class的區別

回答


他們之間的區別主要是 一個是更加安全的 一個是相對不安全的

  1. enum枚舉的類型 我們可以直接用 不包含作用域 而enum class則必須包含作用域
  2. enum可以進行隱式的類型轉換 enum class則不行

26. 2022. C++中new和malloc的區別 free和delete的區別

參考博客

內存精講


他們的區別如下 其實new和malloc 和free和delete可以用一套模板來答題 這里就只寫一個的了

  1. new是操作符 malloc是函數
  2. new創建對象的時候會開辟空間和啟用構造函數 malloc只會開辟空間
  3. new的底層是malloc
  4. malloc申請空間的時候 需要手動計算大小 而new只需要傳遞類型即可

27. 2023.C++中this指針的作用

參考博客


類和對象詳解

回答


this指針是一個隱藏參數 它存在于每個類的非靜態成員函數中

它的主要作用是訪問類的成員變量和成員函數

比如說 我們定義兩個對象 d1 d2 他們同時調用print函數 那么編譯器怎么知道是要調用哪個函數呢? 這里實際上就是this指針在發揮作用

this指針可以為空 當只用this指針調用函數的時候 系統就不會報錯 當然調用對象就不行了

(當然這里實際上是編譯器優化成了 類 ::函數的形式 還是不建議這樣寫)

28. 2024. 可以使用delete this嘛

理論上是可以的 但是實際上我們并不介意這么使用 它的主要作用是允許對象在成員函數中進行銷毀

29. 2025. C++中memcpy和memmove有什么區別

參考博客

內存函數

這兩個函數都是將源目標的數據復制到指定目標

但是memmove更加安全 因為即使有重疊區域 memmove也能更好的處理

那么memmove是如何處理的呢?

簡單來說就是比較地址的大小 選擇一種不會臟數據的方式進行復制

30. 2036. C++中使用模塊的優缺點

參考博客

模板初階


優點

  1. 提高代碼復用性 允許我們編寫和類型無關的代碼
  2. stl的基石
  3. 高性能 編譯器件就確定 減少了運行時的消耗
  4. 類型安全 它會在編譯期間進行檢查 減少錯誤的發生

缺點

  1. 編譯時間增加
  2. 報錯信息增加 難以定位錯誤
  3. 代碼膨脹
  4. 可讀性和維護性下降

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

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

相關文章

第一天 Linux驅動程序簡介

目錄 一、驅動的作用 二、裸機驅動 VS linux驅動 1、裸機驅動 2、linux驅動 三、linux驅動位于哪里? 四、應用編程 VS 內核編程 1、共同點 2、不同點 五、linux驅動分類 1、字符設備 2、塊設備 3、網絡設備 六、Linux驅動學習難點與誤區 1、學習難點 …

PaddleX產線集成功能的使用整理

一、環境搭建 1.1 安裝paddle-gpu 需要根據安裝機器的cuda的版本,選擇合適的版本進行安裝 #安裝paddle-gpu 官網鏈接 https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/pip/linux-pip.html python -m pip install paddle…

docker-compese 啟動mysql8.0.36與phpmyadmin,并使用web連接數據庫

1、找一個文件夾,比如 E:\zqy\file\mysql,cd到這個目錄下創建文件docker-compose.yml 2、將下面的代碼塊復制到docker-compose.yml文件中 version: 3.3 services:mysql:image: mysql:8.0.36container_name: mysqlrestart: alwaysports:- 3306:3306netw…

解決 Gradle 構建錯誤:Could not get unknown property ‘withoutJclOverSlf4J’

解決 Gradle 構建錯誤:Could not get unknown property ‘withoutJclOverSlf4J’ 在構建 Spring 源碼或其他基于 Gradle 的項目時,可能會遇到如下錯誤: Could not get unknown property withoutJclOverSlf4J for object of type org.gradle…

mcp 接freecad畫齒輪

from mcp.server.fastmcp import FastMCP import freecad.gears.commands import os from freecad import app from freecad import part mcp FastMCP("Demo")mcp.tool() def create_gear(num_teeth20,height10,double_helix True):"""創建一個漸開線…

【大前端系列19】JavaScript核心:Promise異步編程與async/await實踐

JavaScript核心:Promise異步編程與async/await實踐 系列: 「全棧進化:大前端開發完全指南」系列第19篇 核心: 深入理解Promise機制與async/await語法,掌握現代異步編程技術 📌 引言 在JavaScript的世界中,異步編程是無…

如何排查java程序的宕機和oom?如何解決宕機和oom?

排查oom 用jmap生成我們的堆空間的快照Heap Dump(堆轉儲文件),來分析我們的內存占用 用可視化工具,例如java中的jhat分析Heap Dump文件 ,它分析完會通過一個瀏覽器打開一個可視化頁面展示分析結果 根據oom的類型來調…

什么是 OLAP 數據庫?企業如何選擇適合自己的分析工具

引言:為什么企業需要 OLAP 數據庫? 你是否曾經經歷過這樣的場景: 市場部門急需一份用戶行為分析報告,數據團隊告訴你:“數據太大了,報表要跑 4 個小時”;業務負責人在會議中提出一個臨時性分析…

測試:認識Bug

目錄 一、軟件測試的生命周期 二、bug 一、軟件測試的生命周期 軟件測試貫穿于軟件的生命周期。 需求分析: ???度:軟件需求是否合理 技術?度:技術上是否可?,是否還有優化空間 測試?度:是否存在業務邏輯錯誤、…

綜合實驗2

1、sw1和sw2之間互為備份 [sw1]interface Eth-Trunk 0 (創建聚合接口) [sw1-Eth-Trunk0]trunkport g0/0/1 (將物理接口劃入到聚合接口中) [sw1-Eth-Trunk0]trunkport g0/0/2 [sw2]interface Eth-Trunk 0 [sw2-Eth-T…

【ArcGIS】ArcGIS10.6徹底卸載和ArcGIS10.2安裝全過程

卸載python3后,解決了ArcGIS與python3沖突問題后,軟件可以正常打開使用了 但是還是出現了問題 用ArcGIS 進行空間分析時,中間操作沒有任何報錯和問題,但是就是沒有運行結果 在別人的軟件上操作一遍可以出現運行結果 關閉確有這個,但真的不是我給它的運行時間不夠,反反復復試…

Django之旅:第五節--Mysql數據庫操作(一)

Django開發操作數據庫更簡單,內部提供了ORM框架 一、安裝第三方模塊 pip install mysqlclient注:最新的django框架需要使用mysqlclient模塊,之前pymysql模塊與django框架有編碼兼容問題。 二、ORM 1、ORM可以幫助我們做兩件事:…

docker部署mongodb數據庫

1、下載 MongoDB 鏡像 使用Docker部署MongoDB 之前,我們需要從 Docker Hub 上下載 MongoDB 鏡像。這里我們下載最新版本的 MongoDB 鏡像,使用以下命令進行下載: docker pull mongo:latest 下載完成后,我們就擁有了最新版本的 Mon…

Enhanced PEC-YOLO:電力施工場景安全裝備檢測的輕量化算法解析

目錄 一、核心概述 二、核心創新點 1. ?C2F_Faster_EMA模塊 2. ?SPPF_CPCA多尺度模塊 3. ?BiFPN頸部網絡

【人工智能】解鎖大模型潛力:Ollama 與 DeepSeek 的分布式推理與集群部署實踐

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著大語言模型(LLM)的快速發展,其推理能力在自然語言處理、代碼生成等領域展現出巨大潛力。然而,單機部署難以滿足高并發、低延遲的需…

RTMP推流服務器nginx在linux上的編譯部署

RTMP(Real-Time Messaging Protocol)推流確實需要服務器支持?。RTMP推流服務器的主要功能是接收來自推流客戶端的數據流,對其進行處理和轉發。服務器會根據RTMP協議與客戶端建立連接,處理推流數據(如轉碼、錄制等&…

PyQt6實例_批量下載pdf工具_主線程停止線程池

目錄 前置: 代碼: 視頻: 前置: 1 本系列將以 “PyQt6實例_批量下載pdf工具”開頭,放在 【PyQt6實例】 專欄 2 本系列涉及到的PyQt6知識點: 線程池:QThreadPool,QRunnable; 信號與…

Tomcat生產服務器性能優化

試想以下這個情景:你已經開發好了一個程序,這個程序的排版很不錯,而且有著最前沿的功能和其他一些讓你這程序增添不少色彩的元素。可惜的是,程序的性能不怎么地。你也十分清楚,若現在把這款產品退出市場,肯…

正則表達式-筆記

文章目錄 一、正則表達式二、正則表達式的基本語法字符類普通字符非打印字符特殊字符 量詞限定符錨點修飾符(標記) 三、在 Python 中使用正則表達式簡單搜索提取信息替換文本 參考 從驗證用戶輸入,到從大量文本中提取特定信息,再到…

Qwen-0.5b linux部署

參考鏈接 https://blog.csdn.net/imwaters/article/details/145489543 https://modelscope.cn/models/modelscope/ollama-linux 1. ollama安裝 # 安裝ModelScope工具包,用于下載和管理AI模型 pip install modelscope# 下載Ollama的Linux版本安裝包 # --model 指定…