【面經分享-CPP篇】[建議收藏!!] C++基礎20問-01

🍭 大家好這里是清隆學長 ,一枚熱愛算法的程序員

? 本系列打算持續跟新c++面試基礎

👏 感謝大家的訂閱? 和 喜歡💗

文章目錄

    • 1.題目:解釋C++中的RAII機制。
    • 2.題目:解釋C++中的智能指針及其類型。
    • 3.題目:解釋C++中的多態性及其實現方式。
    • 4.題目:解釋C++中的引用和指針的區別。
    • 5.題目:如何在C++中進行異常處理?
    • 6.題目:解釋C++11中的`std::move`和`std::forward`。
    • 7.題目:如何實現一個線程安全的單例模式?
    • 8.題目:解釋C++中的虛函數和純虛函數。
    • 9.題目:解釋C++中的命名空間及其用途。
    • 10.題目:解釋C++中的四種類型轉換:`static_cast`、`dynamic_cast`、`const_cast`、`reinterpret_cast`。
    • 11.題目:如何在C++中使用函數指針?
    • 12.題目:解釋C++11中的Lambda表達式及其用途。
    • 13.題目:什么是內聯函數?如何在C++中定義內聯函數?
    • 14.題目:解釋C++中的構造函數和析構函數。
    • 15.題目:什么是友元函數?如何在C++中定義友元函數?
    • 16.題目:解釋C++ STL中的`std::vector`和`std::list`的區別。
    • 17.題目:解釋C++11中的`auto`和`decltype`關鍵字。
    • 18.題目:如何檢測和防止內存泄漏?
    • 19.題目:解釋C++中的模板及其用途。
    • 20.題目:如何在C++中重載運算符?

1.題目:解釋C++中的RAII機制。

考點:C++基礎
答案解析
RAII(Resource Acquisition Is Initialization)是一種管理資源的編程慣用法。它的核心思想是將資源的獲取和釋放綁定到對象的生命周期。資源在對象創建時獲取,在對象銷毀時釋放。常見的應用包括文件句柄、內存管理等。C++中的智能指針(如std::unique_ptrstd::shared_ptr)就是RAII的典型實現。

2.題目:解釋C++中的智能指針及其類型。

考點:內存管理
答案解析
C++11引入了智能指針來自動管理內存,避免內存泄漏。主要有三種類型:

  • std::unique_ptr:獨占所有權的智能指針,不能復制,只能移動。
  • std::shared_ptr:共享所有權的智能指針,多個shared_ptr可以指向同一個對象,使用引用計數來管理對象的生命周期。
  • std::weak_ptr:弱引用,不影響shared_ptr的引用計數,通常用于解決循環引用問題。

3.題目:解釋C++中的多態性及其實現方式。

考點:面向對象編程
答案解析
多態性是面向對象編程的一個基本特性,允許同一接口調用不同的實現。C++中通過虛函數實現多態性。基類中聲明虛函數,派生類中重寫該虛函數,通過基類指針或引用調用派生類的實現。

class Base {
public:virtual void show() {std::cout << "Base class" << std::endl;}
};class Derived : public Base {
public:void show() override {std::cout << "Derived class" << std::endl;}
};int main() {Base* b = new Derived();b->show(); // 輸出 "Derived class"delete b;return 0;
}

4.題目:解釋C++中的引用和指針的區別。

考點:C++基礎
答案解析

  • 引用:引用是一個變量的別名,必須在聲明時初始化,不能改變引用的對象。引用使用起來更安全,因為它不能為null。
  • 指針:指針是一個變量,存儲另一個變量的地址,可以在聲明后初始化,也可以改變指向的對象。指針可以為null,使用時需要注意內存管理。

5.題目:如何在C++中進行異常處理?

考點:異常處理
答案解析
C++中使用trycatchthrow關鍵字進行異常處理。try塊中包含可能拋出異常的代碼,catch塊中處理異常,throw用于拋出異常。

try {// 可能拋出異常的代碼throw std::runtime_error("An error occurred");
} catch (const std::exception& e) {std::cout << "Caught exception: " << e.what() << std::endl;
}

6.題目:解釋C++11中的std::movestd::forward

考點:C++ 高級特性
答案解析

  • std::move:用于將對象轉換為右值引用,從而啟用移動語義,避免不必要的拷貝。
  • std::forward:用于完美轉發,將參數保持其原有的左值或右值屬性,通常在模板中使用。

7.題目:如何實現一個線程安全的單例模式?

考點:多線程與并發
答案解析
線程安全的單例模式可以通過雙重檢查鎖定(Double-Checked Locking)來實現。以下是一個示例代碼:

#include <mutex>class Singleton {
public:static Singleton* getInstance() {if (instance == nullptr) {std::lock_guard<std::mutex> lock(mutex_);if (instance == nullptr) {instance = new Singleton();}}return instance;}private:Singleton() {}static Singleton* instance;static std::mutex mutex_;
};Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex_;

8.題目:解釋C++中的虛函數和純虛函數。

考點:繼承與多態
答案解析

  • 虛函數:在基類中使用virtual關鍵字聲明的函數,允許在派生類中重寫,實現多態性。
  • 純虛函數:在基類中聲明但不提供實現的虛函數,使用= 0語法,表示該類是抽象類,不能實例化,必須在派生類中實現。
class Base {
public:virtual void show() {std::cout << "Base class" << std::endl;}virtual void pureVirtualFunction() = 0; // 純虛函數
};class Derived : public Base {
public:void show() override {std::cout << "Derived class" << std::endl;}void pureVirtualFunction() override {std::cout << "Implemented pure virtual function" << std::endl;}
};int main() {Base* b = new Derived();b->show(); // 輸出 "Derived class"b->pureVirtualFunction(); // 輸出 "Implemented pure virtual function"delete b;return 0;
}

9.題目:解釋C++中的命名空間及其用途。

考點:名字空間
答案解析
命名空間用于組織代碼,避免命名沖突。可以使用namespace關鍵字定義命名空間,并使用::操作符訪問命名空間中的成員。

namespace MyNamespace {void myFunction() {std::cout << "Hello from MyNamespace" << std::endl;}
}int main() {MyNamespace::myFunction(); // 輸出 "Hello from MyNamespace"return 0;
}

10.題目:解釋C++中的四種類型轉換:static_castdynamic_castconst_castreinterpret_cast

考點:類型轉換
答案解析

  • static_cast:用于基本類型之間的轉換和具有明確繼承關系的指針或引用的轉換。
  • dynamic_cast:用于多態類型的安全向下轉換,運行時檢查類型。
  • const_cast:用于去除或添加const屬性。
  • reinterpret_cast:用于任意類型的指針轉換,通常用于底層操作。

11.題目:如何在C++中使用函數指針?

考點:函數指針
答案解析
函數指針是指向函數的指針,可以用于回調函數或實現多態性。

#include <iostream>void hello() {std::cout << "Hello, world!" << std::endl;
}int main() {void (*funcPtr)() = &hello;funcPtr(); // 輸出 "Hello, world!"return 0;
}

12.題目:解釋C++11中的Lambda表達式及其用途。

考點:Lambda 表達式
答案解析
Lambda表達式是匿名函數,用于簡化代碼,特別是在STL算法中。語法為[捕獲列表](參數列表) -> 返回類型 { 函數體 }

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};std::for_each(vec.begin(), vec.end(), [](int x) {std::cout << x << " ";}); // 輸出 "1 2 3 4 5"return 0;
}

13.題目:什么是內聯函數?如何在C++中定義內聯函數?

考點:內聯函數
答案解析
內聯函數是建議編譯器將函數調用展開為函數體,以減少函數調用的開銷。使用inline關鍵字定義內聯函數。

inline int add(int a, int b) {return a + b;
}int main() {std::cout << add(3, 4) << std::endl; // 輸出 7return 0;
}

14.題目:解釋C++中的構造函數和析構函數。

考點:構造函數與析構函數
答案解析

  • 構造函數:在對象創建時自動調用,用于初始化對象。可以重載。
  • 析構函數:在對象銷毀時自動調用,用于清理資源。不能重載,類中只能有一個析構函數。
class MyClass {
public:MyClass() {std::cout << "Constructor called" << std::endl;}~MyClass() {std::cout << "Destructor called" << std::endl;}
};int main() {MyClass obj; // 輸出 "Constructor called"// 程序結束時輸出 "Destructor called"return 0;
}

15.題目:什么是友元函數?如何在C++中定義友元函數?

考點:友元函數
答案解析
友元函數是可以訪問類的私有和保護成員的非成員函數。使用friend關鍵字聲明友元函數。

class MyClass {
private:int data;
public:MyClass(int d) : data(d) {}friend void showData(const MyClass& obj);
};void showData(const MyClass& obj) {std::cout << "Data: " << obj.data << std::endl;
}int main() {MyClass obj(42);showData(obj); // 輸出 "Data: 42"return 0;
}

16.題目:解釋C++ STL中的std::vectorstd::list的區別。

考點:STL 容器
答案解析

  • std::vector:動態數組,支持隨機訪問,插入和刪除操作的時間復雜度為O(n),適用于需要頻繁訪問元素的場景。
  • std::list:雙向鏈表,不支持隨機訪問,插入和刪除操作的時間復雜度為O(1),適用于需要頻繁插入和刪除元素的場景。

17.題目:解釋C++11中的autodecltype關鍵字。

考點:C++11 新特性
答案解析

  • auto:用于自動推導變量的類型,簡化代碼。
  • decltype:用于推導表達式的類型,通常用于模板編程。
int main() {auto x = 5; // x 的類型為 intdecltype(x) y = 10; // y 的類型為 intstd::cout << x << " " << y << std::endl; // 輸出 "5 10"return 0;
}

18.題目:如何檢測和防止內存泄漏?

考點:內存泄漏
答案解析

  • 檢測:可以使用工具如Valgrind、AddressSanitizer等來檢測內存泄漏。
  • 防止:使用RAII和智能指針(如std::unique_ptrstd::shared_ptr)來自動管理內存,避免手動管理內存帶來的風險。

19.題目:解釋C++中的模板及其用途。

考點:模板編程
答案解析
模板是C++中的一種泛型編程工具,允許編寫與類型無關的代碼。模板分為函數模板和類模板。函數模板用于定義與類型無關的函數,類模板用于定義與類型無關的類。

template <typename T>
T add(T a, T b) {return a + b;
}template <typename T>
class Stack {
private:std::vector<T> elems;
public:void push(T const& elem) {elems.push_back(elem);}void pop() {if (elems.empty()) {throw std::out_of_range("Stack<>::pop(): empty stack");}elems.pop_back();}T top() const {if (elems.empty()) {throw std::out_of_range("Stack<>::top(): empty stack");}return elems.back();}
};

20.題目:如何在C++中重載運算符?

考點:運算符重載
答案解析
運算符重載允許為用戶定義的類型定義新的運算符行為。可以通過成員函數或友元函數來重載運算符。

class Complex {
private:double real, imag;
public:Complex(double r, double i) : real(r), imag(i) {}Complex operator+(const Complex& other) const {return Complex(real + other.real, imag + other.imag);}void print() const {std::cout << "(" << real << ", " << imag << ")" << std::endl;}
};int main() {Complex c1(1.0, 2.0), c2(2.0, 3.0);Complex c3 = c1 + c2;c3.print(); // 輸出 (3.0, 5.0)return 0;
}

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

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

相關文章

從內存到sql的upsert

業務的upsert ? 在寫業務時&#xff0c;大家一開始都會以順序流程的方式開始著手寫代碼&#xff0c;CR時再看代碼&#xff0c;會有不一樣的感覺。 1. 需求描述 ? 現有一張數據庫表&#xff0c;表字段結構如下&#xff1a; 字段名稱類型描述uuidstring數據的唯一鍵datastrin…

代碼隨想錄算法訓練營第四十六天|KM52. 攜帶研究材料、518. 零錢兌換 II、377. 組合總和 Ⅳ

代碼隨想錄算法訓練營第四十六天 KM52. 攜帶研究材料 題目鏈接&#xff1a;KM52. 攜帶研究材料 確定dp數組以及下標的含義&#xff1a;j的含義是當前背包的最大容量&#xff0c;dp[j]背包內物品的總價值確定遞推公式&#xff1a;背包最大容量固定為j&#xff0c;每個循環嘗試…

Nginx01-HTTP簡介與Nginx簡介(安裝、命令介紹、目錄介紹、配置文件介紹)

目錄 HTTP簡介HTTP原理查看訪問網站的詳細流程curl -vwget --debug 查看網站訪問量HTTP協議版本HTTP協議交互HTTP 請求請求報文起始行請求頭 HTTP響應響應報文起始行響應頭 Nginx常見的Web服務常見網站服務 安裝NginxNginx目錄結構Nginx啟動管理Nginx常用命令 Nginx配置文件主配…

國內外主流大模型語言技術大比拼

國內外主流大模型語言技術對比 2024 自2017年起&#xff0c;美國深度布局人工智能&#xff0c;全面融入經濟、文化與社會。至2023年&#xff0c;中國憑借自研技術平臺嶄露頭角&#xff0c;ChatGPT及其技術成國家戰略焦點&#xff0c;引領未來科技浪潮。中美競逐&#xff0c;人工…

Milvus向量數據庫:開啟向量搜索新紀元

Milvus向量數據庫&#xff1a;開啟向量搜索新紀元 隨著人工智能和機器學習技術的飛速發展&#xff0c;向量數據在各個領域的應用越來越廣泛&#xff0c;如推薦系統、自然語言處理、計算機視覺等。在這樣的背景下&#xff0c;如何高效地存儲、查詢和管理向量數據成為了一個重要的…

香橙派 AI pro:AI 加速初體驗

香橙派 AI pro&#xff1a;AI 加速初體驗 在AI領域&#xff0c;不斷涌現的硬件產品為開發者提供了前所未有的便利和可能性。今天&#xff0c;我要介紹的這款產品——香橙派 AIpro&#xff0c;就是其中的佼佼者。在昇騰 AI 芯片的加持下&#xff0c;這款開發板有著出色的算力。…

961題庫 北航計算機 操作系統 附答案 選擇題形式

有題目和答案&#xff0c;沒有解析&#xff0c;不懂的題問大模型即可&#xff0c;無償分享。 第1組 習題 計算機系統的組成包括&#xff08; &#xff09; A、程序和數據 B、處理器和內存 C、計算機硬件和計算機軟件 D、處理器、存儲器和外圍設備 財務軟件是一種&#xff…

【Qt 學習筆記】Qt窗口 | 對話框 | Qt對話框的分類及介紹

博客主頁&#xff1a;Duck Bro 博客主頁系列專欄&#xff1a;Qt 專欄關注博主&#xff0c;后期持續更新系列文章如果有錯誤感謝請大家批評指出&#xff0c;及時修改感謝大家點贊&#x1f44d;收藏?評論? Qt窗口 | 對話框 | 模態對話框 文章編號&#xff1a;Qt 學習筆記 / 51…

Java反序列化漏洞與URLDNS利用鏈分析

前言 前面學習過 Java 反序列化漏洞的部分知識&#xff0c;總結過幾篇文章&#xff1a; 文章發布日期內容概括《滲透測試-JBoss 5.x/6.x反序列化漏洞》2020-07-08JBoss 反序列化漏洞 CVE-2017-12149 的簡單復現&#xff0c;使用了 ysoserial 和 CC5 鏈&#xff0c;未分析漏洞…

easy-captcha生成驗證碼

引入依賴 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>…

[力扣題解] 404. 左葉子之和

題目&#xff1a;404. 左葉子之和 思路 前序遍歷&#xff08;隨便怎么遍歷&#xff09;&#xff1b; 在遇到左葉子時處理數據&#xff0c;選擇中、左、右里面的左的時候再判斷這個節點是不是葉子&#xff1b; 代碼 /*** Definition for a binary tree node.* struct TreeNo…

Unity2D游戲開發-玩家控制

在Unity2D游戲開發中&#xff0c;玩家控制是游戲互動性的核心。本文將解析一個典型的Unity2D玩家控制腳本&#xff0c;探討如何實現流暢的玩家移動、跳躍和動畫切換。以下是一個Unity腳本示例&#xff0c;實現了這些基礎功能。 1. 腳本結構 using System.Collections; using …

機械設計手冊第一冊:公差

形位公差的標注&#xff1a; 形位公差框格中&#xff0c;不僅要表達形位公差的特征項目、基準代號和其他符號&#xff0c;還要正確給出公差帶的大小、形狀等內容。 1.形位公差框格&#xff1a; 形位公差框格由兩個框格或多個格框組成&#xff0c;框格中的主要內容從左到右按…

(2024,擴散,去噪調度,維度,誤差,收斂速度)適應基于分數的擴散模型中的未知低維結構

Adapting to Unknown Low-Dimensional Structures in Score-Based Diffusion Models 公和眾和號&#xff1a;EDPJ&#xff08;進 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 進 V 交流群&#xff09; 目錄 0. 摘要 1. 引言 1.1 擴散模型 1.2 現有結果的不…

服務器硬件基礎知識學習

服務器硬件基礎知識涵蓋了從CPU到存儲&#xff0c;再到網絡連接和總線技術等關鍵組件。 1. 處理器 - 兩大流派&#xff1a;我們常用的處理器主要分為Intel和AMD兩大陣營。Intel的Xeon系列和AMD的EPYC系列都是專為服務器設計的&#xff0c;它們支持多核處理&#xff0c;能夠應對…

語言模型的校準技術:增強概率評估

? 使用 DALLE-3 模型生成的圖像 目錄 一、說明 二、為什么校準對 LLM 模型至關重要 三、校準 LLM 概率的挑戰 四、LLM 的高級校準方法 4.1 語言置信度 4.2 增強語言自信的先進技術 4.3 基于自一致性的置信度 4.4 基于 Logit 的方法 五、代理模型或微調方法 5.1 使用代…

集成算法實驗與分析(軟投票與硬投票)

概述 目的&#xff1a;讓機器學習效果更好&#xff0c;單個不行&#xff0c;集成多個 集成算法 Bagging&#xff1a;訓練多個分類器取平均 f ( x ) 1 / M ∑ m 1 M f m ( x ) f(x)1/M\sum^M_{m1}{f_m(x)} f(x)1/M∑m1M?fm?(x) Boosting&#xff1a;從弱學習器開始加強&am…

排序-插入排序與選擇排序

插入排序 基本思想 把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中&#xff0c;直到所有的記錄插入完為止&#xff0c;得到一個新的有序序列 。 打撲克牌整理手牌用的就是插入排序的思想 代碼實現 void InsertSort(int* a, int n) { assert(a); …

C語言自定義類型

在C語言中&#xff0c;自定義類型可以通過typedef關鍵字來實現。typedef用于為現有的數據類型創建新的名稱&#xff08;別名&#xff09;&#xff0c;使代碼更清晰易讀。自定義類型的一個常見用途是簡化復雜的類型聲明&#xff0c;特別是在使用結構體、枚舉和函數指針時。 使用…

52、有邊數限制的最短路

有邊數限制的最短路 題目描述 給定一個n個點m條邊的有向圖&#xff0c;圖中可能存在重邊和自環&#xff0c; 邊權可能為負數。 請你求出從1號點到n號點的最多經過k條邊的最短距離&#xff0c;如果無法從1號點走到n號點&#xff0c;輸出impossible。 注意&#xff1a;圖中可…