91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中命名的強制類型轉換方法

發布時間:2021-08-24 17:25:34 來源:億速云 閱讀:146 作者:chen 欄目:開發技術

本篇內容介紹了“C++中命名的強制類型轉換方法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

目錄
  • 總結

命名的強制類型轉換:
形式:

cast-name<type>(expression);

type是強制轉換的類型,expression是強制轉換的值。如果type是引用類型,則結果是左值。case-name是C++四種轉換類型static_cast、dynamic_cast、const_cast和reinterpret_cast的一種。

static_cast

可以被用于強制隱形轉換(例如,non-const對象轉換為const對象,int轉型為double,等等)作用于對象,它還可以用于很多這樣的轉換的反向轉換 (例如,void*指針轉型為有類型指針,基類指針轉型為派生類指針),但是它不能將一個const對象轉型為non-const對象(只有 const_cast能做到),它最接近于C-style的轉換。應用到類的指針上,意思是說它允許子類類型的指針轉換為父類類型的指針(這是一個有效的隱式轉換),同時,也能夠執行相反動作:轉換父類為它的子類。

int i;
float j = 10.2;
i = const_cast<int>(j);			// 將j轉換int型賦值給i,損失了一定的精度

const_cast

一般用于強制消除對象的常量性。它是唯一能做到這一點的C++風格的強制轉型。這個轉換能剝離一個對象的const屬性,也就是說允許你對常量進行修改。不能使用const_cast改變表達式的類型, const_cast的類型只能是指針,引用或指向對象類成員的指針

const int constant = 21;
int* modifier = const_cast<int*>(&constant);	// 舊版的寫法 int* modifier = (int*)(&constant)
*modifier = 7;

std::cout << modifier << std::endl;		// 測試輸出的地址為0x61feec
std::cout << &constant << std::endl;	// 測試輸出的地址為0x61feec
 
std::cout << *modifier << std::endl;	// 輸出的值為 7
std::cout << constant << std::endl;		// 輸出的值為 21
// 上面可以看出,兩個指針指向同一塊地址,但是解引用的結果確不相同。
// const的值,是不能真的被改變。但是可以對可以對modifier進行重新賦值

const_cast常用的情況:

/*
我們可能調用了一個參數不是const的函數,而我們要傳進去的實際參數確實const的,但是我們知道這個函數是不會對參數做修改的。于是我們就需要使用const_cast去除const限定,以便函數能夠接受這個實際參數
*/
#include <iostream>
using namespace std;

void Printer (int* val,string seperator = "\n")
{
	cout << val << seperator;
}

int main(void) 
{	
	const int consatant = 20;
	//Printer(consatant);        //Error: invalid conversion from 'int' to 'int*'
	Printer(const_cast<int *>(&consatant));
	return 0;
}

reinterpret_cast

**作用于底層二進制。**是特意用于底層的強制轉型,導致實現依賴(就是說,不可移植)的結果,例如,將一個指針轉型為一個整數。這樣的強制類型在底層代碼以外應該極為罕見。操作結果只是簡單的從一個指針到別的指針的值得二進制拷貝。在類型之間指向的內容不做任何類型的檢查和轉換。將一個指針轉換成其他類型的指針。reinterpret_cast被作為二進制轉換重新解釋(沒有數位損失)。

int j;
int *p = new(int);
// j = p;	  // error: invalid conversion from 'int*' to 'int' [-fpermissive]
j = reinterpret_cast<int>(p);  //將指針類型,轉換成int型
std::cout << j << std::endl;   // 輸出int型的結果

dynamic_cast

主要用于執行“安全的向下轉型(safe downcasting)”,也就是說,要確定一個對象是否是一個繼承體系中的一個特定類型。支持父類指針到子類指針的轉換,這種轉換時最安全的轉換。它 是唯一不能用舊風格語法執行的強制類型轉換,也是唯一可能有重大運行時代價的強制轉換。

【擴展】 舊版的強制類型轉換

在早期的C++語言中,顯示地進行強制類型轉換包含兩種形式:

type (expr);		// 函數形式的強制類型轉換
(type) expr;		// 變量類型的強制類型轉換

根據涉及的類型不同,舊式的強制類型轉換分別與static_cast、const_cast或reinterpret_cast有相似的行為。當我們在某處執行舊式的強制類型轉換時,如果能換成static_cast、const_cast也合法,則其行為與對應的命名轉換一致。如果替換不合法,則舊式指針強制轉換類型與reinterpret_cast類似的功能。

如:

char *pc = (char*)ip;	// ip是指向整數的指針
char *pc = reinterpret_cast<char*>(ip)	// 等價與上面的式子

“C++中命名的強制類型轉換方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

建德市| 黄骅市| 蓝田县| 清丰县| 乐山市| 商城县| 玉山县| 确山县| 密山市| 渭南市| 藁城市| 措美县| 通化县| 文昌市| 道真| 东乌珠穆沁旗| 锦州市| 丰宁| 松阳县| 平乐县| 镇宁| 汾西县| 望江县| 麻城市| 光山县| 威信县| 泸州市| 自贡市| 霞浦县| 凤城市| 玛沁县| 宁乡县| 济宁市| 凤台县| 石泉县| 理塘县| 大田县| 家居| 新干县| 北辰区| 衡阳县|