C++高頻知識點(四)

文章目錄

  • 16. 虛基類要解決什么問題?
  • 17. C++中如何進行類型轉換操作?列舉并解釋四種類型轉換方式。
  • 18. 什么是函數重載?如何進行函數重載?
  • 19. 解釋C++中的友元函數和友元類,并解釋其使用場景。
    • 友元函數
    • 友元類
  • 20. 請解釋C++中的靜態斷言(Static Assertion)是什么,如何使用它?

16. 虛基類要解決什么問題?

C++中的虛基類(virtual base class)主要用于解決多重繼承中的菱形繼承(diamond inheritance)或稱為鉆石繼承問題。在菱形繼承中,一個類從兩個或多個類中繼承,而這些類又從一個共同的基類繼承。如果沒有使用虛基類,那么最終的派生類會包含多個基類的副本,這可能導致數據冗余和意外行為。

以下是一個菱形繼承的示例:

class Base {  
public:  int x;  
};  class Derived1 : public Base {  // ...  
};  class Derived2 : public Base {  // ...  
};  class FinalDerived : public Derived1, public Derived2 {  // ...  
};

在這里插入圖片描述

        Base/    \Derived1  Derived2\    /FinalDerived

為了解決這個問題,我們可以將基類聲明為虛基類:

          Base/      \
Derived1(virtual) Derived2(virtual)\      /FinalDerived
class Base {  
public:  int x;  
};  class Derived1 : virtual public Base {  // ...  
};  class Derived2 : virtual public Base {  // ...  
};  class FinalDerived : public Derived1, public Derived2 {  // ...  
};

現在,FinalDerived的對象只包含一個Base類的成員x的副本。這是因為Derived1和Derived2都是虛擬繼承自Base,所以它們共享同一個Base的子對象。

17. C++中如何進行類型轉換操作?列舉并解釋四種類型轉換方式。

在C++中,類型轉換操作允許程序員將一個數據類型的值轉換為另一個數據類型的值。以下是四種主要的類型轉換方式,以及它們的解釋:

  1. 靜態類型轉換(Static Cast)
    靜態類型轉換是最常用的類型轉換方式,它用于基礎數據類型之間的轉換,以及從派生類到基類的轉換(安全的向下轉型)。它不會執行運行時檢查,因此如果轉換是不安全的,可能會導致未定義的行為。
    示例:
double d = 3.14;  
int i = static_cast<int>(d); // 將double類型的d轉換為int類型的i
  1. 動態類型轉換(Dynamic Cast)
    動態類型轉換主要用于類層次結構中,**安全地將基類指針或引用轉換為派生類指針或引用。**如果轉換是無效的(即基類指針不指向派生類對象),則動態類型轉換將返回空指針(對于指針)或拋出異常(對于引用)。動態類型轉換只在支持RTTI(運行時類型識別)的類(即包含至少一個虛函數的類)上有效。
    示例:
class Base {};  
class Derived : public Base {};  Base* b = new Derived();  
Derived* d = dynamic_cast<Derived*>(b); // 如果b確實指向Derived對象,則轉換成功
  1. 常量類型轉換(Const Cast)
    常量類型轉換用于去除或添加const或volatile限定符。它主要用于將指向const對象的指針或引用轉換為指向非const對象的指針或引用(注意:這樣做可能會破壞const語義,導致程序出錯)。
    示例:
const int* pc = &i;  
int* p = const_cast<int*>(pc); // 去除const限定符
  1. 重新解釋類型轉換(Reinterpret Cast)
    重新解釋類型轉換提供了最低級別的轉換,它**可以把任何指針類型轉換為任何其他指針類型,把任何整數類型轉換為任何指針類型,或者把任何指針類型轉換為任何整數類型。**這種轉換非常危險,因為它不進行任何類型檢查,完全依賴于程序員知道自己在做什么。
    示例:
int* i = new int(10);  
char* c = reinterpret_cast<char*>(i); // 將int*轉換為char*

18. 什么是函數重載?如何進行函數重載?

在C++中,函數重載是一種功能,它允許程序員在同一作用域內定義多個同名函數,但它們的參數列表(參數類型、參數數量或參數順序)必須不同。編譯器根據傳遞給函數的參數類型、數量和順序來確定調用哪個函數。

在這里插入圖片描述
以下是一個簡單的函數重載示例:

#include <iostream>  // 第一個重載函數,接受一個整數參數  
void print(int x) {  std::cout << "Integer: " << x << std::endl;  
}  // 第二個重載函數,接受一個浮點數參數  
void print(double x) {  std::cout << "Double: " << x << std::endl;  
}  // 第三個重載函數,接受兩個整數參數  
void print(int x, int y) {  std::cout << "Two integers: " << x << " and " << y << std::endl;  
}  int main() {  print(5);        // 調用第一個重載函數  print(5.5);      // 調用第二個重載函數  print(5, 10);    // 調用第三個重載函數  return 0;  
}

需要注意的是,函數重載只與函數名和參數列表有關,與函數的返回類型、函數所在的類或其他任何東西都無關。

19. 解釋C++中的友元函數和友元類,并解釋其使用場景。

在C++中,友元函數和友元類是兩個特殊的概念,它們打破了數據封裝的原則,允許非成員函數或類直接訪問另一個類的私有或保護成員。

友元函數

定義:
一個函數如果不是某個類的成員函數,但它需要訪問該類的私有或保護成員,那么可以將該函數聲明為該類的友元函數。
語法:
在類定義中,使用 friend 關鍵字來聲明友元函數。

class MyClass {  
private:  int privateVar;  public:  MyClass(int var) : privateVar(var) {}  // 聲明友元函數  friend void friendFunction(MyClass& obj);  
};  // 定義友元函數  
void friendFunction(MyClass& obj) {  std::cout << obj.privateVar << std::endl;  // 可以訪問私有成員  
}

使用場景:

  1. 運算符重載:有時我們需要為類重載一些運算符,如 +、-、<< 等。由于這些運算符不是類的成員函數,但又需要訪問類的私有成員,因此可以將它們聲明為類的友元函數。
  2. 兩個類需要共享數據:當兩個類之間需要緊密合作,并且需要共享一些私有數據時,可以將一個類的成員函數聲明為另一個類的友元函數。

友元類

定義:
如果一個類需要訪問另一個類的私有或保護成員,那么可以將這個類聲明為另一個類的友元類。
語法:
在類定義中,使用 friend 關鍵字來聲明友元類。

class MyClass2;  // 前置聲明  class MyClass1 {  
private:  int privateVar;  public:  MyClass1(int var) : privateVar(var) {}  // 聲明MyClass2為友元類  friend class MyClass2;  
};  class MyClass2 {  
public:  void accessPrivateVar(MyClass1& obj) {  std::cout << obj.privateVar << std::endl;  // 可以訪問MyClass1的私有成員  }  
};

在這里插入圖片描述

20. 請解釋C++中的靜態斷言(Static Assertion)是什么,如何使用它?

在C++中,靜態斷言(Static Assertion)是一種在編譯時檢查條件是否滿足的機制。如果條件不滿足,編譯器會發出錯誤消息并停止編譯。這種機制對于在編譯時捕捉一些常見的編程錯誤非常有用。

C++11標準引入了static_assert關鍵字來實現靜態斷言。static_assert接受兩個參數:第一個參數是一個布爾表達式,第二個參數(可選)是一個字符串字面量,用于在斷言失敗時輸出錯誤消息。

以下是使用static_assert的基本語法:

static_assert(condition, "error message if condition is false");

其中condition是一個在編譯時就能計算出結果的布爾表達式,"error message if condition is false"是當condition為假時,編譯器輸出的錯誤消息。

以下是一個簡單的例子,演示了如何在C++中使用static_assert:

#include <iostream>  int main() {  const int arraySize = 5;  static_assert(arraySize > 0, "Array size must be greater than zero!");  // 如果arraySize小于或等于0,上面的static_assert會導致編譯錯誤  // 假設我們有一個數組,這里只是示意  int myArray[arraySize];  // ... 數組的其他操作 ...  return 0;  
}

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

之后我會持續更新,如果喜歡我的文章,請記得一鍵三連哦,點贊關注收藏,你的每一個贊每一份關注每一次收藏都將是我前進路上的無限動力 !!!↖(▔▽▔)↗感謝支持!

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

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

相關文章

【Servlet資源轉發介紹】

文章目錄 前言一、Servlet 資源轉發是什么&#xff1f;1. 為什么要資源轉發&#xff1f; 二、資源轉發 vs 重定向三、如何使用 RequestDispatcher 進行資源轉發1. 引入依賴2. 獲取 RequestDispatcher3. forward 示例4. include 示例JSP 中 include 指令或動作Servlet 中 includ…

牛客周賽 Round 99題解

Round 99 思路&#xff1a;我們之間去用字符串去統計即可&#xff0c;輸入一個字符串&#xff0c;看相鄰有沒有99即可 #include<bits/stdc.h> using namespace std; #define int long long string s; signed main() {cin>>s;int ns.size();for(int i1;i<n;i){i…

AR 如何改變我們構建網站的方式

想坐在沙發上試鞋子&#xff1f;歡迎來到 Web AR 的世界。還記得你在網頁上逛商城時&#xff0c;點擊一副墨鏡&#xff0c;然后鏡頭打開&#xff0c;它就自動出現在你臉上的那一瞬間嗎&#xff1f;不需要下載 App&#xff0c;不需要跳轉&#xff0c;只需一個瀏覽器。這不是科幻…

華為OD機試 2025B卷 - 貨幣單位轉換(C++PythonJAVAJSC語言)

2025B卷目錄點擊查看: 華為OD機試2025B卷真題題庫目錄|機考題庫 + 算法考點詳解 2025B卷 100分題型 題目描述 記賬本上記錄了若干條多國貨幣金額,需要轉換成人民幣分(fen),匯總后輸出。 每行記錄一條金額,金額帶有貨幣單位,格式為數字+單位,可能是單獨元,或者單獨分…

php協程

開發需求:在一套老項目中&#xff08;fastadmin&#xff09;實現一個定時任務&#xff0c;每分鐘訪問幾十個接口&#xff0c;拿到數據。 使用的swoole&#xff0c;在thinkphp5中實現協程。啟動命令php swoole.php <?php //chdir(__DIR__); define(APP_PATH, __DIR__ . /app…

【教程】強制關閉Windows防火墻的自啟動

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你&#xff0c;歡迎[點贊、收藏、關注]哦~ 背景說明 字節云的Windows server真是有點問題&#xff0c;忽然就開始自動開啟防火墻&#xff0c;手動關閉了過幾個小時又重新開啟了&#xff0c;導致…

【Qt】QSignalMapper

QSignalMapper 是 Qt 提供的一個用于信號映射的類&#xff0c;它允許將多個信號源&#xff08;例如按鈕點擊&#xff09;映射到一個單一的槽函數&#xff0c;并傳遞自定義參數。這在需要根據不同的觸發對象執行相似邏輯時非常有用。 用法說明 創建 QSignalMapper 實例&#xf…

Android Binder與AIDL與Service使用案例及分析

水一篇以前寫的文章?? Binder是Android內置的一種比較高效的跨進程機制,它很復雜,也很好用,可以讓我們像調用普通方法那樣完成跨進程式方法調用和數據傳遞。我們現在只需要知道它比較復雜以及怎么使用即可。 ALDL全名Android interface Definition Language, 是Android…

基于ConvLSTM的行人檢測與跟蹤預測算法研究

基于ConvLSTM的行人檢測與跟蹤預測算法研究 摘要 本文詳細探討了基于ConvLSTM(卷積長短期記憶網絡)的行人檢測與跟蹤預測算法的設計與實現。該算法結合了卷積神經網絡(CNN)的空間特征提取能力和長短期記憶網絡(LSTM)的時間序列建模優勢,能夠有效處理視頻序列中的行人檢測與…

深度學習基礎2

5.張量索引操作 &#xff08;1&#xff09;索引操作 行列索引列表索引 print(data[[0, 2], [1, 2]]) #返回(0, 1)&#xff0c;(2, 2)兩個位置的元素print(data[[[0], [1]], [1, 2]]) # 返回0&#xff0c;1行的1&#xff0c;2列共4個元素范圍索引 print(data[:3, :2]) # 前3行前…

Web安全:CSRF的攻擊原理與防御措施

什么是 CSRF&#xff1f; CSRF&#xff08;Cross-Site Request Forgery&#xff0c;跨站請求偽造&#xff09;是一種利用 瀏覽器自動攜帶 Cookie 的機制&#xff0c;誘騙用戶在已登錄目標網站的情況下&#xff0c;執行惡意操作的攻擊方式。 攻擊核心特點&#xff1a; 攻擊者 不…

學習記錄2025

1、Cmake相關 cmake -S . -B build -S . 表示CMakeLists.txt在哪個目錄 -B build CMake生成結果在哪個路徑 build就是路徑名 簡短 cmake -B build 或進入build 文件夾下 cmake cmake --build build 在build文件夾下編譯 常量&#xff1a;CMAKE_CURRENT_LIST_DIR CMAKE…

GIT操作 學習

登錄gitee登錄方式&#xff1a;通過網站登錄&#xff0c;使用注冊時的賬號&#xff08;通常是手機號&#xff09;和密碼進行認證創建倉庫 &#xfeff;新建倉庫步驟命名規范&#xff1a;倉庫名稱應盡量符合規范&#xff0c;避免與已有倉庫沖突&#xff0c;建議使用有意義的命名…

[論文精讀]StruQ: Defending Against Prompt Injection with Structured Queries

StruQ: Defending Against Prompt Injection with Structured Queries [2402.06363] StruQ: Defending Against Prompt Injection with Structured Queries usenix security 2025 提示注入攻擊是一個重要的威脅&#xff1a;它們誘使模型偏離原始應用程序的指令&#xff0c;轉…

磁懸浮軸承的反饋線性化:非線性控制的智能解耦之道

摘要:磁懸浮軸承憑借無摩擦、高速度、長壽命等優勢,成為高速旋轉機械的理想支撐方案。然而,其本質非線性與強耦合特性使得傳統線性控制方法難以滿足高性能要求。本文深入解析反饋線性化技術如何精確解除磁懸浮系統的非線性耦合,揭示其從微分幾何理論到工程實現的核心路徑,…

探尋《答案之書》:在隨機中尋找生活的指引

我強烈推薦4本可以改變命運的經典著作&#xff1a; 《壽康寶鑒》在線閱讀白話文《欲海回狂》在線閱讀白話文《陰律無情》在線閱讀白話文《了凡四訓》在線閱讀白話文 在快節奏的現代生活中&#xff0c;人們常常面臨各種困惑與抉擇。當常規的思考與決策方式無法帶來清晰答案時&am…

【PTA數據結構 | C語言版】計算1~n平方的和加上1~n的和

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄 題目代碼 題目 給定正整數 n&#xff0c;請編寫程序&#xff0c;求 (12?n^2 )(12?n) 的值。 輸入格式&#xff1a; 輸入在一行中給出正整數 n&#xff08;≤100&#xff09;。 輸出格式&#xff1a; 在一行中…

Assistant API的原理及應用

&#x1f9e0; 什么是 Assistants API&#xff1f; &#x1f4c5; **發布日期&#xff1a;**2023年11月6日&#xff0c;OpenAI在開發者大會上發布了 Assistants API —— 一款面向開發者的工具&#xff0c;用于在應用中構建 AI 助手。 ? 它可以做什么&#xff1f; Assistants …

《北京市加快推動“人工智能+醫藥健康“創新發展行動計劃(2025-2027年)》深度解讀

引言 隨著新一輪科技革命和產業變革的深入推進,人工智能技術與醫藥健康的深度融合已成為全球科技創新的重要方向。北京市于2025年7月正式發布《北京市加快推動"人工智能+醫藥健康"創新發展行動計劃(2025-2027年)》,旨在充分發揮北京在人工智能技術策源、頭部醫療…

DPDK 關于 IOMMU 設置

一、IOMMU 基礎概念 定義:IOMMU(Input/Output Memory Management Unit)即輸入 / 輸出內存管理單元,它是一種硬件機制,用于將設備發出的內存訪問請求進行地址轉換。在現代計算機系統中,它在設備與內存之間起到橋梁作用,提供內存保護和設備隔離功能。作用: 內存保護:防止…