【C++】面試題

1、都說c++是面向對象的語言,面向對象的三個特性能 [展開] 介紹一下嗎?

封裝:封裝是一種集中管理的思想,把內部的數據和實現方法組合在一起,并且不對外暴漏內部的數據和實現方法,只對外提供幾個接口來完成函數的調用和數據的操作,保證了數據的安全性和一致性。

繼承:繼承是指一個類可以繼承另一個類的方法和數據,可以提高代碼的復用性,建立類與類之間的關系。

多態:多態是指同一個方法對于不同的對象有不同的行為,提高了代碼的靈活度。

2、多態的底層實現有了解過嗎?

多態的底層是通過一個虛函數指針實現的,虛函數指針指向一塊虛函數表,虛函數表當中存儲的各個函數的地址,虛函數表是一個指針數組,虛函數表中存儲的是函數指針,當一個表達式滿足多態的時候,它確定類型的時候就不是在編譯階段,而是在運行階段來判斷是什么類型,然后根據不同的對象來調用虛函數表。

3、虛函數它底層又是怎么實現的?

當一個類中的函數被virtual修飾之后,就會多出一個虛函數指針,虛函數指針指向虛函數表。

4、(場景一)有兩個類它們的實例變量以及它們支持的函數方法完全相同,一個類實現了一個虛函數,它們有什么區別?它們生成一個實例對象的內存占用一樣嗎?

占用內存不一樣,實現了虛函數就會多一個虛函數指針,會多出4/8字節的空間,內存占用不同。

5、(場景二)有四個類 B、C 繼承 A,D 繼承 B、C(多繼承),A 中有一個 public 函數,然后 B、C 里面各自重寫了,然后從 D 里面想要調用 B 或則 C 的實現要怎么調用呢?

直接用類域操作符::,指定類域調用。

6、還是上述的場景,A 里邊有一個 public 變量,B、C 是繼承自 A 的,D 繼承自 B、C,那么 D 里邊又存儲了幾份 public 變量(一直在引導我,是一份、兩份、三份)

這題需要分類討論。

普通繼承:兩份(B、C當中各自一份)。

虛繼承:一份,直接放在公共區。

7、malloc 跟 new 有什么區別呀?

1、malloc返回類型是(void*)需要手動強制類型轉換。

2、malloc內存分配錯誤返回NULL,而new是拋異常。

3、new分配內存的同時會調用構造函數進行初始化,malloc需要手動初始化。

4、malloc分配內存的時候需要手動計算開多大的空間,new不需要。

5、new釋放內存使用delete,malloc使用free。

6、new的底層也是去調用operator new,在operator new當中也是調用malloc來實現內存分配的。

8、new 除了分配內存它還會比 malloc 還有其他額外的操作嗎?

會調用構造函數進行初始化。

9、new 實際上是做了兩件事嘛,一個是分配內存、一個是調用實例的構造函數,那有了解過 new 可以只進行一個操作嘛?比如只分配內存不調用構造函數、或者只調用構造函數不分配內存嘛?

不分配內存,只調用構造函數:定位new(placement new)以及operator new

不調用構造函數,只分配內存:new (std::nothrow) type

10、計算下面兩個結構體的sizeof是多少

struct {char A;char B;int C;
}struct {char A;int C;char B;
}

內存對齊問題。

第一個是8字節。

第二個是12字節。

11、看你寫了對STL熟悉,那智能指針你有了解過嘛?

1、最早期的智能指針是auto_ptr,但這種智能指針并沒有完全實現了指針的功能,主要是實現了RAII的思想,以及權限轉移。

2、然后出現了unique_ptr,這個智能指針的做法比較粗暴,不讓拷貝,禁止調用拷貝構造。

3、然后就是shared_ptr,這個智能指針解決了原來的問題:一塊地址只能被一個智能指針指向,否則就會導致同一塊內存被釋放兩次。解決方法:利用引用計數。但依舊存在循環引用的問題。

4、weak_ptr,一個輔助性質的智能指針,用于解決循環引用的問題,讓內部的指針變量用weak_ptr來表示,weak_ptr不會修改引用計數,所以能夠很好的解決循環引用的問題。

12、舉一個實際場景智能指針的例子?為什么用?怎么使用的?不用可以嘛?

在關于異常安全的時候就最好用智能指針。

比如以下代碼:

#include<iostream>
using namespace std;int div()
{int a, b;cin >> a >> b;if (b == 0)throw invalid_argument("除0錯誤");return a / b;
}
void Func()
{// 1、如果p1這里new 拋異常會如何?// 2、如果p2這里new 拋異常會如何?// 3、如果div調用這里又會拋異常會如何?int* p1 = new int;int* p2 = new int;cout << div() << endl;delete p1;delete p2;
}
int main()
{try{Func();}catch (exception& e){cout << e.what() << endl;}return 0;
}

不使用智能指針,就會導致各種內存沒有被釋放,或者直接沒有開空間的問題。

可以不用指針指針嗎?可以,但是需要套好幾層異常捕捉,太麻煩,代碼的可讀性也變得很低了。

13、剛才你提到了shared_ptr 底層是用一個引用計數來實現的共享,那還了解過其他的內存管理方式嘛?

JAVA中的內存自動回收機制,是通過比較復雜的一套算法來計算回收的時機,具體沒有深入了解。

14、STL 里邊常用的 vector 容器的擴容機制有了解過嘛?

擴容機制在不同平臺不一樣。

VS:1.5倍。

Linux:2倍。

擴容是重新開一片空間,然后把原來的內容拷貝過來,再銷毀原來的空間。

15:擴容3倍可以嘛?

可以,但是可能會導致大量的空間浪費。

16:vector 的初始容量了解過嘛?什么時候會進行初次擴容?

在第一次添加元素的時候會進行擴容,第一個擴容一般會設置為8或者16。

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

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

相關文章

DockePod信號處理機制與僵尸進程優化

Docke&Pod信號處理與僵尸進程優化 容器與信號的關系 SIGTERM信號&#xff1a;程序結束(terminate)信號&#xff0c;這是用來終止進程的標準信號&#xff0c;也是 kill 、 killall 、 pkill 命令所發送的默認信號。與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程…

k8s和docker簡單介紹

當涉及到容器技術和容器編排時&#xff0c;Docker和Kubernetes是兩個重要的概念。我將更詳細地介紹它們以及它們之間的關系。 Docker&#xff1a; Docker是一種容器化技術&#xff0c;它允許你將應用程序及其依賴項打包到一個稱為"容器"的封閉環境中。每個容器都包…

rust包跨平臺編譯,macbook ,linux

在 MacBook 上編譯 Rust 項目并生成 Linux 包需要一些步驟。以下是一般的步驟概述&#xff1a; 1. **安裝所需工具&#xff1a;** 首先&#xff0c;確保您的 MacBook 上已經安裝了所需的工具。您需要 Rust 編程語言的工具鏈以及一些用于交叉編譯到 Linux 的工具。 - 安裝 R…

【BASH】回顧與知識點梳理(二十一)

【BASH】回顧與知識點梳理 二十一 二十一. Linux 的文件權限與目錄配置21.1 使用者與群組屬主(文件擁有者)屬組(群組概念)其他人的概念root(萬能的天神)Linux 用戶身份與群組記錄的文件 21.2 Linux 文件權限概念Linux 文件屬性Linux 文件權限的重要性 21.3 如何改變文件屬性與權…

組合模式(C++)

定義 將對象組合成樹形結構以表示部分-整體’的層次結構。Composite使得用戶對單個對象和組合對象的使用具有一致性(穩定)。 應用場景 在軟件在某些情況下&#xff0c;客戶代碼過多地依賴于對象容器復雜的內部實現結構&#xff0c;對象容器內部實現結構(而非抽象接口)的變化…

Redis數據結構——鏈表list

鏈表是一種常用的數據結構&#xff0c;提供了順序訪問的方式&#xff0c;而且高效地增刪操作。 Redis中廣泛使用了鏈表&#xff0c;例如&#xff1a;列表的底層實現之一就是鏈表。 在Redis中&#xff0c;鏈表分為兩部分&#xff1a;鏈表信息 鏈表節點。 鏈表節點用來表示鏈表…

PyTorch深度學習實踐---筆記

PyTorch深度學習實踐---筆記 2.線性模型&#xff08;Linear Model&#xff09;2.exercise 3. 梯度下降算法&#xff08;Gradient Descent&#xff09;3.1梯度下降&#xff08;Gradient Descent&#xff09;3.2 隨機梯度下降&#xff08;Stochastic Gradient Descent&#xff09…

亞馬遜測評工作室怎么做?

亞馬遜是全球最大的電商平臺之一&#xff0c;任何一個賣家想要提升自己店鋪的知名度和銷量&#xff0c;都需要關注自己Listing的Review數量和星級評價&#xff0c;而測評對于賣家賬號的評定和產品曝光量有著重要影響&#xff0c;可以用于店鋪提升銷量&#xff0c;留評等 在進行…

【GC日志分析】-對象晉升到老年代分析

[GC (Allocation Failure) [PSYoungGen: 123456K->65432K(262144K)] 123456K->765432K(1048576K), 0.1234567 secs] [Times: user0.10 sys0.02, real0.13 secs] 從這段GC日志中&#xff0c;可以看到兩個年輕代和老年代的堆內存容量變化情況。 首先&#xff0c;我們來看…

百度坐標(BD09)、國測局坐標(火星坐標,GCJ02)、和WGS84坐標系之間的轉換

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><script>/*** * 百度坐標&#xff08;BD09&#xff09;、國測局坐標&#xff08;火星坐標&#xff0c;GCJ02&#xff09;、和…

c51單片機串口通信(中斷方式接收數據)(單片機--單片機通信)示例代碼 附proteus圖

單片機一般采用中斷方式接受數據&#xff0c;這樣便于及時處理 #include "reg51.h" #include "myheader.h" #define uchar unsigned char int szc[10]{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; int bufferc[6]{0}; int sza[6]{0x01,0x02,0x0…

HOT96-只出現一次的數字

leetcode原題鏈接&#xff1a;只出現一次的數字 題目描述 給你一個 非空 整數數組 nums &#xff0c;除了某個元素只出現一次以外&#xff0c;其余每個元素均出現兩次。找出那個只出現了一次的元素。你必須設計并實現線性時間復雜度的算法來解決此問題&#xff0c;且該算法只使…

TEXTure環境配置,跑通inference的demo

TEXTure 環境配置安裝kaolin這個包,這里可能會遇到各種問題配置huggingface的訪問令牌 運行Text Conditioned Texture Generation指令報錯1報錯2成功運行 查看結果查看貼圖后的三維網格模型 環境配置 # 創建一個名為texture的環境 conda create -n texture python3.9 -y# 激活…

EasyLLM:簡化語言模型處理,實現 OpenAI 和 Hugging Face 客戶端的無縫切換

前言 在這短短不到一年的時間里&#xff0c;國內外涌現的大型語言模型&#xff08;LLM&#xff09;可謂是百花齊放&#xff0c;不管是開源還是閉源都出現了一些非常優秀的模型&#xff0c;然而在利用LLM進行應用開發的時候&#xff0c;會發現每個模型從部署、到訓練、微調、AP…

人工智能任務1-【NLP系列】句子嵌入的應用與多模型實現方式

大家好&#xff0c;我是微學AI&#xff0c;今天給大家介紹一下人工智能任務1-【NLP系列】句子嵌入的應用與多模型實現方式。句子嵌入是將句子映射到一個固定維度的向量表示形式&#xff0c;它在自然語言處理&#xff08;NLP&#xff09;中有著廣泛的應用。通過將句子轉化為向量…

ASP.NET Core - 緩存之分布式緩存

分布式緩存是由多個應用服務器共享的緩存&#xff0c;通常作為訪問它的應用服務器的外部服務進行維護。 分布式緩存可以提高 ASP.NET Core 應用的性能和可伸縮性&#xff0c;尤其是當應用由云服務或服務器場托管時。 與其他將緩存數據存儲在單個應用服務器上的緩存方案相比&am…

沁恒ch32V208處理器開發(三)GPIO控制

目錄 GPIO功能概述 CH32V2x 微控制器的GPIO 口可以配置成多種輸入或輸出模式&#xff0c;內置可關閉的上拉或下拉電阻&#xff0c;可以配置成推挽或開漏功能。GPIO 口還可以復用成其他功能。端口的每個引腳都可以配置成以下的多種模式之一&#xff1a; 1 浮空輸入 2 上拉輸入…

AMEYA360:DNB1101大唐恩智浦工規級電池管理芯片

大唐恩智浦作為全球領先的半導體供應商&#xff0c;一直致力于為全球客戶提供高質量的解決方案。在電池管理芯片領域&#xff0c;大唐恩智浦推出的DNB1101可謂是一款工規級的電池管理芯片&#xff0c;其卓越的性能和可靠性成為市場上備受全球領先的半導體供應商&#xff0c;一直…

c#編碼技巧(十四):全面總結delegate、Func委托的寫法演變

delegate委托對于初學者來說不太好理解。 按筆者的經驗&#xff0c;delegate本質是函數指針&#xff0c;可以把它理解為某一類方法的入口&#xff0c;把他翻譯為&#xff1a;“長得像XXX的函數方法&#xff08;入參是什么、返回值是什么&#xff09;”可能更容易理解。 以下示例…

2023杭電多校第7場M題-M. Minimal and Maximal XOR Sum

題目鏈接&#xff1a;csoj | M. Minimal and Maximal XOR Sum (scnu.edu.cn) 解題思路&#xff1a; 最小值&#xff1a;每次操作的區間長度為2&#xff0c;即交換兩個相鄰數&#xff0c;每次異或2(10)&#xff0c;故最小值肯定為2(10)或0(00)&#xff0c;如果是偶排序最小值是…