C++類型轉換可調用對象

目錄

C++的四種可視性類型轉換

1.static_cast

2.reinterpret_cast

3.const_cast

4.dynamic_cast

C++中的可調用對象

普通函數

函數指針

仿函數

Lambda表達式

包裝器function

bind


C++的四種可視性類型轉換

C語言中的類型轉換是不安全、不明確的,于是C++就出了更加安全,可視化的類型轉換。

1.static_cast

static_cast是用于C語言中可以隱式類型轉換的類型之間,當編譯器隱式執行類型轉換時,大多數編譯器會給出警告該操作會損失精度,而采用static_cast可以明確告訴編譯器,這是知情的情況下進行的。

使用static_cast

2.reinterpret_cast

reinterpret_cast用于C語言中某些不能隱式類型轉換的類型之間,例如:不同指針類型之間

使用reinterpret_cast

3.const_cast

const_cast用于const指針、引用->非const指針、引用之間的轉換

4.dynamic_cast

dynamic_cast是用于父類到子類之間指針、引用的轉換。默認子類對象、指針、引用可以賦值給父類(切片)

下面的情況就可以父類指針、引用賦值給子類指針、引用

改為:

這里使用了C語言中不同指針類型的強制類型轉換,本質是對指針可以訪問空間大小的改變

上面的例子中,Person* -> Student*的原因是它本來就是指向的一個Student,于是就可以從父類指針再回到子類指針。但是如果原本父類指針只是指向父類對象,強轉訪問會造成越界!

C++中使用dynamic_cast進行安全的向下轉型,如果轉型失敗會返回nullptr。從而有效避免越界。

C++中的可調用對象

普通函數

int a = 10, b = 20;
func(a, b);//普通函數

函數指針

int (*func_ptr)(int, int)=func;//函數指針
func_ptr(10, 20);

仿函數

class Func
{
public:int operator()(int a, int b){return a + b;}
};
int main()
{Func f;//仿函數f(10, 20);return 0;
}

Lambda表達式

//lambda表達式 [] 捕獲列表 ()參數列表 ->返回類型
auto flam=[](int a, int b)->int {return a + b;};
flam(10, 20);

包裝器function

包裝器是C++的一個模板類,可以將任何可調用對象賦值給包裝器對象,常用于業務邏輯的注冊。

//使用包裝器可以將任何可調用對象賦值給包裝器
function<int(int, int)> fun1 = func;
function<int(int, int)> fun2=func_ptr;
function<int(int, int)> fun3 = f;
function<int(int, int)> fun4 = flam;

包裝器玩法:

#include<functional>
#include<unordered_map>
int Add(int a, int b)
{return a + b;
}
int Sub(int a, int b)
{return a - b;
}
int Mul(int a, int b)
{return a * b;
}
int Div(int a, int b)
{if (b != 0)return a / b;elsereturn 0;
}
int main()
{unordered_map<string, function<int(int, int)>> business;//存儲業務邏輯business["+"] = Add;//將業務添加到business中business["-"] = Sub;business["*"] = Mul;business["/"] = Div;cout << business["+"](2, 3) << endl;//調用指定業務邏輯return 0;
}

bind

bind就像一個可調用對象適配器,通過接收一個可調用對象,生成一個新的可調用對象。

新的可調用對象可以原來的形參列表進行調整。

直接舉例示范:

甚至可以使參數在實際傳入時調換順序

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

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

相關文章

MQTT QoS 0, 1, 2

目錄 # 開篇 1. 精細MQS TT QoS的行為 1.1 QoS 0: 最多交付一次&#xff08;At Most Once&#xff09; 1.2 QoS 1: 至少交付一次&#xff08;At Least Once&#xff09; 1.3 QoS 2: 只交付一次&#xff08;Exactly Once&#xff09; 1.4 傳輸過程圖示 1.5 總結 2. MQTT…

HTTP協議頭中X-Forwarded-For是能做什么?

X-Forwarded-For和相關幾個頭部的理解 $remote_addr 是nginx與客戶端進行TCP連接過程中&#xff0c;獲得的客戶端真實地址. Remote Address 無法偽造&#xff0c;因為建立 TCP 連接需要三次握手&#xff0c;如果偽造了源 IP&#xff0c;無法建立 TCP 連接&#xff0c;更不會有后…

javascript 的 屬性、方法、事件

使用 javascript 設計一個學生類、&#xff08;屬性&#xff1a;ID、姓名、性別,方法&#xff1a;學習、休息、&#xff0c;事件&#xff1a;上學、放學、上課、下課&#xff09;學校有定時器每1秒鐘觸發一次時鐘事件&#xff0c;每節課45分鐘&#xff0c;課間15分鐘 var Stud…

13. Lammps入門in文件簡介-1

來源&#xff1a; “碼農不會寫詩”公眾號 鏈接&#xff1a;Lammps入門in文件簡介-1 文章目錄 01 in文件簡介02 in文件命令解析規則 書回正文 Lammps通過一次一行地從輸入腳本&#xff08;文本文件&#xff0c;通常稱in文件&#xff09;中讀取命令來執行計算&#xff0c;當輸入…

7-1作業

1.實驗目的&#xff1a;完成字符收發 led.h #ifndef __GPIO_H__ #define __GPIO_H__#include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h"//RCC,GPIO,UART初始化 void init();//字符數據發送 void set_tt…

Web端登錄頁和注冊頁源碼

前言&#xff1a;登錄頁面是前端開發中最常見的頁面&#xff0c;下面是登錄頁面效果圖和源代碼&#xff0c;CV大法直接拿走。 1、登錄頁面 源代碼&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>登錄</ti…

Django 和 Django REST framework 創建對外 API

1. 環境準備 確保你已經安裝了 Python 和 Django。如果尚未安裝 Django REST framework&#xff0c;通過 pip 安裝它&#xff1a; pip install djangorestframework 2. 創建 Django 項目 如果你還沒有 Django 項目&#xff0c;可以通過以下命令創建&#xff1a; django-ad…

每日復盤-20240701

今日關注&#xff1a; 20240701 六日漲幅最大: ------1--------301182--------- 凱旺科技 五日漲幅最大: ------1--------300977--------- 深圳瑞捷 四日漲幅最大: ------1--------300977--------- 深圳瑞捷 三日漲幅最大: ------1--------300461--------- 田中精機 二日漲幅最…

Lua實現鏈表(面向對象應用)

Lua實現面向對象 面向對象核心三要素Lua面向對象大致原理面向對象示例繼承與多態示例 面向對象核心三要素 1.封裝&#xff1a;對一個事物的抽象為一些屬性和行為動作的集合&#xff0c;封裝將屬性和行為動作&#xff08;操作數據的方法&#xff09;綁定在一起&#xff0c;并隱藏…

快錢支付股東全部股權已被質押!

根據近期工商信息&#xff0c;第三方支付機構快錢支付清算信息有限公司&#xff08;簡稱“快錢支付”&#xff09;實際控股方快錢金融服務&#xff08;上海&#xff09;有限公司&#xff08;簡稱“快錢金融”&#xff09;&#xff0c;作為出質股權標的企業&#xff0c;被出質給…

【SGX系列教程】(三)Intel-SGX 官方示例分析(SampleCode)——SampleEnclave

文章目錄 一. 引言二. README2.1 項目目的2.2 構建和執行示例代碼的步驟2.3 配置參數解釋2.4 配置文件分析2.5 啟動令牌初始化 三. 重點代碼分析3.1 App文件夾3.1.1 App/App.cpp3.1.2 App/Edger8rSyntax文件夾3.1.2.1 App/Edger8rSyntax/Arrays.cpp3.1.2.2 App/Edger8rSyntax/F…

一文全概括,建議收藏,那些你不可錯過的IC設計書籍合集(可下載)

集成電路設計工程師的角色不僅是推動技術創新的中堅力量&#xff0c;更是實現產品從概念到現實的關鍵橋梁。隨著對高性能、低功耗芯片的需求不斷增長&#xff0c;IC設計工程師的專業技能和知識深度成為了衡量其職業價值的重要標準。無論是在數字邏輯設計、功能驗證、可測試性設…

JMeter--定時執行的方法

原文網址&#xff1a;JMeter--定時執行的方法_IT利刃出鞘的博客-CSDN博客 簡介 本文介紹JMeter如何使用定時器定時執行測試任務。 Java技術星球&#xff1a;way2j.com 方法 第一步&#xff1a;新建定時器 右鍵測試任務> Add > Timer> Constant Timer 如下圖所示…

qt中數據庫和excel互導數據————附帶詳細步驟和代碼

文章目錄 0 背景1 準備QXlsx環境1.1 cmake安裝使用1.2 qmake使用 2 把excel數據導出到mysql數據庫3 把mysql數據庫的數據寫入到excel4 完整代碼5 項目代碼倉庫 0 背景 因為需要批量導入和導出數據&#xff0c;所以需要用到excel。實現把數據庫的數據導入到excel中&#xff0c;…

圓圈序號1~10復制粘貼直接用

1. 空心圓圈數字序號&#xff1a; ①、②、③、④、⑤、⑥、⑦、⑧、⑨、⑩ 2. 實心圓圈數字序號&#xff1a; ?、?、?、?、?、?、?、?、?、? 3. 空心圓圈中文序號&#xff1a; 一、二、三、四、五、六、七、八、九、十

linux高級編程(線程)(1)

虛擬地址&#xff1a; 線程&#xff1a; 概念&#xff1a;線程是輕量級進程&#xff0c;一般是一個進程中的多個任務。 進程是系統中最小的資源分配單位。&#xff08;競爭計算機資源的最小單位&#xff09;&#xff08;進程能分配硬件資源&#xff0c;線程不行&#x…

解析QAnything啟動命令過程

一.啟動命令過程日志 啟動命令bash ./run.sh -c local -i 0 -b hf -m Qwen-1_8B-Chat -t qwen-7b-chat。輸入日志如下所示&#xff1a; rootMM-202203161213:/mnt/l/20230918_RAG方向/QAnything# bash ./run.sh -c local -i 0 -b hf -m Qwen-1_8B-Chat -t qwen-7b-chat From …

Leetcode Java學習記錄——棧和隊列 IDEA

文章目錄 棧和隊列stack Classqueue InterfaceDeque Interfaceadd 和 push Priority Queue -- Class題目 codestyleIDEA 操作快捷鍵選擇代碼生成類 棧和隊列 stack Class google stack java 8/12 empty() peek() pop() push(E item) search(Object o) 最近相關性會用到棧 …

湘潭大學軟件工程數據庫總結

文章目錄 前言試卷結構給學弟學妹的一些參考自己的一些總結 前言 自己可能很早很早之前就準備復習了&#xff0c;但是感覺還是沒有學到要點&#xff0c;主要還是沒啥緊迫的壓力&#xff0c;我們是三月份開學&#xff0c;那時候實驗室有朋友挺認真開始學習數據庫了&#xff0c;…

理性決策的藝術:從購房到擇偶的數學智慧;37% 規則,做出最佳決策的秘訣;用數學模型解決人生難題

在面對人生重大決策時&#xff0c;如購房或擇偶&#xff0c;我們常常感到迷茫和困惑。然而&#xff0c;如果我們能夠將這些看似復雜的問題簡化為數學模型&#xff0c;我們就能以更加理性和系統的方式做出決策。 37%規則 1950年代&#xff0c;當時幾位數學家開始研究這樣一個問…