C++--類型轉換

1.什么是類型轉換

在傳統C語言中,由強制類型轉換和隱式類型轉換,隱式類型轉換,編譯器在在編譯階段自動處理,能轉換則轉換,強制類型轉換由用戶自己轉換。

缺陷:

  • 轉換的可視性比較差,所有的轉換形式都是以一種相同形式書寫,難以跟蹤錯誤的轉換
  • 隱式類型轉化有些情況下可能會出問題:比如數據精度丟失
  • 顯式類型轉換將所有情況混合在一起,代碼不夠清晰
    ?

比如:

??? int a = 100;
?? ?long long b = a;//隱式類型轉換
?? ?char c = b;//隱式類型轉換
?? ?size_t d = a;//隱式類型轉換
?? ?cout << a <<" " <<" " << b <<" " << c <<" " << d << endl;
?? ?//強制類型轉換
?? ?double e = (double)a;
?? ?float f = (double)e;
?? ?cout << e << " " << f << endl;

在C++中,也可以使用C語言的轉換方式,但在C++中,有自己的轉換方式,

標準C++為了加強類型轉換的可視性,引入了四種命名的強制類型轉換操作符:
static_cast、reinterpret_cast、const_cast、dynamic_cast

2.不同操作符使用場景

2.1 static_cast使用

在static_cast中,它的使用方法相對于C語言中的隱式類型轉換,只能轉換兩種類型比較接近的,不能用于不相干類型的轉換。

比如:

??? int a = 100;
?? ?char b= static_cast<char>(a);
?? ?//char* c = static_cast<char*>(a);//無法轉換
?? ?cout << b << endl;

2.2 reinterpret_cast使用

reinterpret_cast操作符通常為操作數的位模式提供較低層次的重新解釋,強制轉換兩種不相關的類型,即一種類型轉換為另一種不相干的類型,

比如:

??? int a = 100;
?? ?char b= static_cast<char>(a);
?? ?char* c = static_cast<char>(b);//無法轉換

?? ?char* c = reinterpret_cast<char*>(b);
?? ?printf("%c\n", *(&c));

2.3 const_cast使用

const_cast最常用的用途就是刪除變量的const屬性,方便賦值,但是需要使用volatile修飾加了const的變量。

比如:

???? volatile const int a = 10;
?? ? int* p? =const_cast<int*>(&a);
?? ? p = (int*)&a;
?? ?*p = 20;
?? ?cout << *p <<" " << a << endl;

2.4 dynamic_cast使用方法

dynamic_cast用于將一個父類對象的指針/引用轉換為子類對象的指針或引用(動態轉換)

向上轉型:子類對象指針/引用->父類指針/引用(不需要轉換,賦值兼容規則)

向下轉型:父類對象指針/引用->子類指針/引用(用dynamic_cast轉型是安全的)
注意:
1. dynamic_cast只能用于父類含有虛函數的類
2. dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回0
比如:

class A
{
public:
?? ?virtual void f() {}
};

class B : public A
{};

//A*指針有可能指向父類,也有可能指向子類
void fun(A* pa)
{
?? ?// dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回

??? // 如果pa是指向子類,那么可以轉換,轉換表達式返回正確的地址

??? // 如果pa是指向父類,那么不能轉換,轉換表達式返回nullptr

?? ?B* pb1 = static_cast<B*>(pa);
?? ?B* pb2 = dynamic_cast<B*>(pa);//返回空
?? ?cout << "pb1:" << pb1 << endl;

?? ?cout << "pb2:" << pb2 << endl;
}
int main()
{

???? //父類對象無論如何都不能轉換為子類
?? ?A a;
?? ?B b;
?? ?fun(&a);
?? ?fun(&b);
?? ?return 0;
}

?注意
強制類型轉換關閉或掛起了正常的類型檢查,每次使用強制類型轉換前,程序員應該仔細考慮是
否還有其他不同的方法達到同一目的,如果非強制類型轉換不可,則應限制強制轉換值的作用
域,以減少發生錯誤的機會。強烈建議:避免使用強制類型轉換。

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

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

相關文章

Go語言中關鍵字type的多重應用場景詳解

當談及Go語言中的關鍵字type時&#xff0c;我們通常會想到用于定義結構體和接口的常見用法。然而&#xff0c;"type"關鍵字實際上有許多其他用法&#xff0c;本文將對其中幾種常見用法進行簡要總結記錄。 定義結構體和方法 在Go中&#xff0c;我們可以使用type來定…

運維監控學習筆記5

Linux的內存是虛擬內存&#xff0c;是物理內存和交換分區swap。 內存&#xff1a; 頁&#xff1a;4K&#xff0c; 硬盤&#xff1a;塊。 尋址&#xff1a; 空間&#xff1a;內存的合并。大頁內存。 free命令&#xff1a; [rootvm1 ~]# free -htotal used fre…

javap獲取Kotlin方法JNI方法簽名

獲取Kotlin方法簽名和JAVA不一樣的地方就是需要使用Kotlin 命令行編譯器生成.class文件&#xff1a; 編寫一個Kotlin類&#xff0c;添加JNI方法&#xff1a; class TestLib {external fun init(callBack: CallBack)interface CallBack{fun onData(count:Int,data:String)} }在…

cesium學習記錄08-鼠標繪制多邊形

上一篇學習了實體的一些基礎知識&#xff0c;這一篇來學習鼠標繪制實體多邊形的實現 一、方法一&#xff1a; 1&#xff0c;結果顯示 貼地&#xff1a; 不貼地&#xff1a; 2&#xff0c;方法全部代碼&#xff1a; 主方法&#xff1a; /*** 繪制多邊形* param {Object} op…

華為OD機試 - 公共子串計算(Java 2023 B卷 100分)

目錄 專欄導讀一、題目描述二、輸入描述三、輸出描述四、解題思路五、Java算法源碼六、效果展示 華為OD機試 2023B卷題庫瘋狂收錄中&#xff0c;刷題點這里 專欄導讀 本專欄收錄于《華為OD機試&#xff08;JAVA&#xff09;真題&#xff08;A卷B卷&#xff09;》。 刷的越多&…

VictoriaMetrics部署及vmalert集成釘釘告警

1、部署VictoriaMetrics cd /usr/local wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.65.0/victoria-metrics-amd64-v1.65.0.tar.gz mkdir victoria-metrics && tar -xvzf victoria-metrics-amd64-v1.65.0.tar.gz && \ mv …

論AI GPT跨境貿易架構及其應用

摘要 2023年初,我司啟動了智慧化跨境貿易供應鏈一體化平臺的建設工作。我在該項目中擔任系統架構設計師的職務,主要負責設計平臺系統架構和安全體系架構。該平臺以移動信息化發展為契機,采用”平臺+AI”的模式解決現有應用的集中移動化需求。平臺整體的邏輯復雜,對系統的高…

react之Hooks的介紹、useState與useEffect副作用的使用

react之Hooks的介紹、useState與useEffect副作用的使用 一、Hooks的基本介紹二、useState的使用2.1 簡單使用2.2 數組結構簡化2.3 狀態的讀取和修改2.3 組件的更新過程 三、useEffect的使用3.1 副作用介紹3.2 基本使用3.3 依賴3.4 不要對依賴項撒謊3.5 依賴項可以是空數組3.6 清…

ZZULIOJ 1193: 單科成績排序(結構體專題),Java

ZZULIOJ 1193: 單科成績排序&#xff08;結構體專題&#xff09;&#xff0c;Java 題目描述 有一學生成績表&#xff0c;包括學號、姓名、3門課程成績。請按要求排序輸出&#xff1a;若輸入1&#xff0c;則按第1門課成績降序輸出成績表&#xff0c;若輸入為i&#xff08;1<…

清風數學建模——擬合算法

擬合算法 文章目錄 擬合算法概念 確定擬合曲線最小二乘法的幾何解釋求解最小二乘法matlab求解最小二乘法如何評價擬合的好壞計算擬合優度的代碼 概念 在前面的篇幅中提到可以使用插值算法&#xff0c;通過給定的樣本點推算出一定的曲線從而推算出一些想要的值。但存在一些問題…

解決內網GitLab 社區版 15.11.13項目拉取失敗

問題描述 GitLab 社區版 發布不久&#xff0c;搭建在內網拉取項目報錯&#xff0c;可能提示 unable to access https://github.comxxxxxxxxxxx: Failed to connect to xxxxxxxxxxxxxGit clone error - Invalid argument error:14077438:SSL routines:SSL23_GET_S 15.11.13ht…

QT網絡編程之TCP

QT網絡編程之TCP TCP 編程需要用到倆個類: QTcpServer 和 QTcpSocket。 #------------------------------------------------- # # Project created by QtCreator 2023-08-

mysql截取最后一個字符之前的數據

1、mysql截取最后一個字符之前的數據 select --截取斜杠之前的數據REVERSE(SUBSTR(REVERSE(SPNH-dfg-2012) ; --截取斜杠后的數據 INSTR(REVERSE(SPNH-fg-2012),-)1))2、mysql獲取最后一個字符后的數據 select SUBSTRING_INDEX(SPNH-dfg-2012,-,-1) 3、mysql更新某個字段…

SpringBoot 該如何預防 XSS 攻擊

XSS 漏洞到底是什么&#xff0c;說實話我講不太清楚。但是可以通過遇到的現象了解一下。在前端Form表單的輸入框中&#xff0c;用戶沒有正常輸入&#xff0c;而是輸入了一段代碼&#xff1a;</input><img src1 onerroralert1> 這個正常保存沒有問題。問題出在了列表…

驅動 實現三個燈的亮滅

1、編寫LED燈的驅動&#xff0c;可以控制三個燈&#xff0c;應用程序中編寫控制燈的邏輯&#xff0c;要使用自動創建設備節點機制 head.h #ifndef __HEAD_H__ #define __HEAD_H__#define PHY_LED1_MODER 0x50006000 #define PHY_LED1_ODR 0x50006014 #define PHY_LED1_RCC 0x…

設計模式之責任鏈模式【Java實現】

責任鏈&#xff08;Chain of Resposibility&#xff09; 模式 概念 責任鏈&#xff08;chain of Resposibility&#xff09; 模式&#xff1a;為了避免請求發送者與多個請求處理者耦合在一起&#xff0c;于是將所有請求的處理者 通過前一對象記住其下一個對象的引用而連成一條…

什么是ServiceMesh(Istio一)

現在最火的后端架構無疑是微服務了&#xff0c;微服務將之前的單體應用拆分成了許多獨立的服務應用&#xff0c;每個微服務都是獨立的&#xff0c;好處自然很多&#xff0c;但是隨著應用的越來越大&#xff0c;微服務暴露出來的問題也就隨之而來了&#xff0c;微服務越來越多&a…

【Python】使用python解析普通格式的報文為someip格式報文

文章目錄 1.安裝scapy庫2.示例 1.安裝scapy庫 使用 pip 安裝 scapy 第三方庫&#xff0c;打開 cmd&#xff0c;輸入以下命令&#xff1a; pip install scapy出現如圖所示&#xff0c;表示安裝成功&#xff1a; 2.示例 要解析someip格式報文&#xff0c;需要導入someip模塊&a…

【Spring 】了解Spring AOP

目錄 一、什么是Spring AOP 二、AOP的使用場景 三、AOP組成 四、Spring AOP的實現 1、添加Spring AOP依賴 2、定義切面和切點 3、定義相關通知 五、 AOP的實現原理 1、什么是動態代理 2、 JDK代理和CGLIB代理的區別 一、什么是Spring AOP AOP&#xff08;Aspect Ori…

PLY模型格式詳解【3D】

本文介紹PLY 多邊形文件格式&#xff0c;這是一種用于存儲被描述為多邊形集合的圖形對象。 PLY文件格式的目標是提供一種簡單且易于實現但通用的格式足以適用于各種模型。 PLY有兩種子格式&#xff1a;易于入門的 ASCII 表示形式和用于緊湊存儲和快速保存和加載的二進制格式。 …