1. 程式人生 > >C++與型別轉換相關的四個關鍵字及其特點

C++與型別轉換相關的四個關鍵字及其特點

首先,C++與型別轉換相關的四個關鍵字有:const_cast, static_cast, dynamic_cast, reinterpret_cast.

什麼是型別轉換?

表示式是否合法取決於運算元的型別,而且合法的表示式其含義也由運算元型別決定。但是在C++中,某些型別之間存在相關的依賴關係。若兩種型別相關,則可在需要某種型別的運算元位置上,使用該型別的相關型別物件或值。如果兩個型別之間可以相互轉換,則稱這兩個型別相關

那麼,第一個關鍵字登場了,static_cast關鍵字就是提供這種場合下的型別轉換。C++預設的整數型別之間的轉換就屬於這種。

與之相反,如果被轉換的兩種型別之間不相關,比如int指標轉換為char指標,就要使用reinterpret_cast這個關鍵字。

接下來登場的是const_cast。 使用const_cast會消除被轉換型別的const特性,而且只有const型別的變數才能使用。那麼,什麼情況下需要消除一個const變數的const特性呢?比如,有時候有的函式的形參型別為非const型別,那麼如果你要將一個const型別的引數傳入就會報錯。所以在這種情況下需要先使用const_cast轉化一下。

最後,就剩下dynamic_cast了。它是一種作執行時(run-time)檢測的型別轉換。它可以將基類型別的指標或引用安全地轉換為派生型別的指標或引用。當具有基類的引用或指標,但需要執行不是基類組成部分的派生類操作的時候,需要動態的強制型別轉換。通常,從基類指標獲得派生類行為最好的方法是通過虛擬函式。當使用虛擬函式的時候,編譯器自動根據物件的實際型別選擇正確的函式。但是,在某些情況下,不可能使用虛擬函式。這時候就需要使用dynamic_cast關鍵字了。但是,能用虛擬函式還是用虛擬函式最好。

與其他強制型別轉換不同,dynamic_cast涉及執行時型別檢查。如果繫結到引用或指標的物件不是目標型別的物件,則dynamic_cast失敗。

補充:

在上面四個型別轉化關鍵字中,除了static_cast,其他的三個都有可能涉及到指標的型別轉換。從本質上來說,指標的型別不同,並沒有產生很大的差異,他們都是需要足夠的記憶體來存放一個機器地址。“指向不同型別之各指標”間的差異,既不在其指標表示法不同,也不在其內容(代表一個地址)不同,而是在其所定址出來的object不同。也就是說,“指標型別”會教導編譯器如何解釋某個特定地址中的記憶體內容及其大小。

所以,轉換(cast)其實是一種編譯器指令。大部分情況下它並不改變一個指標所含的真正地址,它隻影響“被指出之記憶體大小和其內容”的解釋方式。

相關推薦

C++型別轉換相關關鍵字及其特點

首先,C++與型別轉換相關的四個關鍵字有:const_cast, static_cast, dynamic_cast, reinterpret_cast. 什麼是型別轉換? 表示式是否合法取決於運算元的型別,而且合法的表示式其含義也由運算元型別決定。但是在C++中,某

C++型別轉換相關的4關鍵字

轉自http://blog.csdn.net/xmu_jupiter/article/details/42456307 首先,C++與型別轉換相關的四個關鍵字有:const_cast, static_cast, dynamic_cast, reinterpret_cas

C++中,有哪型別轉換相關關鍵字

C++與型別轉換相關的四個關鍵字有:const_cast, static_cast, dynamic_cast, reinterpret_cast static_cast——運算子完成相關型別之間的轉換 【特點】:靜態轉換,在編譯處理期間。 【應用場合

C++中4型別轉換相關關鍵字

static_cast const_cast dynamic_cast reinterpret_cast 一.型別轉換     表示式是否合法取決於運算元的型別,而且合法的表示式其含義也由運算元型別決定。在C++中,某些型別之間存在相

C++中的4型別轉換相關關鍵字

在C/C++語言中用 (type) value(在C++還可以採用type(value))來進行顯式型別轉換(explicit type conversion),常常又被稱為強制轉換(cast投射/鑄模)。這種轉換的正確性完全掌握在程式設計師手中,傳統上強制轉換往往被過度使

c++中,有哪4型別轉換相關關鍵字,這些關鍵字各有什麼特點,應該在什麼場合下使用?

1、reinterpret_cast<type-id> (expression) type-id 必須是一個指標、引用、算術型別、函式指標或者成員指標。它可以把一個指標轉換成一個整數,也可以把一個整數轉換成一個指標(先把一個指標轉換成一個整數,再把該整數轉換成原型別的指標,還可以得到原先的指標值

【面試題】c++有哪型別轉換相關關鍵字

在C/C++語言中用 (type) value(在C++還可以採用type(value))來進行顯式型別轉換(explicit type conversion),常常又被稱為強制轉換(cast投射/鑄模)。這種轉換的正確性完全掌握在程式設計師手中,傳統上強制轉換往往被過度使

C++中,有哪4型別轉換相關關鍵字?這些關鍵字各有什麼特點,在什麼場合下使用?

1 reinterpret_cast ‘reinterpret_cast’轉換一個指標為其它型別的指標。它也允許從一個指標轉換為整數型別。反之亦然。(譯註:是指標具體的地址值作為整數值?) 這個操作符能夠在非相關的型別之間轉換。操作結果只是簡單的從一個指標到

c++ primer 第十章過載運算型別轉換

c++ primer 第十四章過載運算與型別轉換 14.1 基本概念 14.2 輸入和輸出運算子 14.2.1 過載輸出運算子<< 14.2.2 過載輸入運算子>> 14.3 算術

C++ Pirmer : 第十章 : 過載運算子型別轉換之函式呼叫運算子標準庫的定義的函式物件

函式呼叫運算子 struct test { int operator()(int val) const { return (i > 0 ? i : -i); } }; 所謂的函式呼叫就是一個類過載了函式呼叫符,類在使用過載函式呼叫符時接受相應引數。這一過程就像是使用

C#字元型別轉換常用的轉義符

  常用的轉義符     顯示符號,需要新增\+特殊字元,顯示出來  \為轉義符(在要顯示的每個符號前都加上\)     \+特殊字元,就可以在執行時顯示這個特殊字元    

C++解析(20):智慧指標型別轉換函式

0.目錄 1.智慧指標 2.轉換建構函式 3.型別轉換函式 4.小結 1.智慧指標 記憶體洩漏(臭名昭著的Bug): 動態申請堆空間,用完後不歸還 C++語言中沒有垃圾回收機制 指標無法控制所指堆空間的生命週期 我們需要什麼: 需要一個特殊的指標 指標生命週期結束

C++的型別轉換異常處理

一 名稱和語法 1 C語言風格:不管什麼型別的轉換統統是: TYPE b = (TYPE)a; 2 C++風格: 1)static_cast,靜態型別轉換。如int轉換成char 2)reinterpreter_cast,重新解釋型別 3) dynamic_cast,命名上理解是

C++字元型別轉換(BSTR、_bstr_tCString、char *轉換

1、CString轉BSTR BSTR bstr; CString strSql;  bstr = strSql.AllocSysString(); …  SysFreeString(bstrText

[C++] 過載運算子型別轉換(2)——函式呼叫運算子和型別轉換運算子

1、這兩個應該是C++中比較高階的用法了。 一、函式呼叫運算子   1、過載函式呼叫運算子(),必須是成員函式,一個類可以定義多個不同版本的呼叫運算子,相互之間應該在引數數量或者型別上有所區別。   2、定義了呼叫運算子的類的物件稱作 函式物件;函式

C/C++基礎----過載運算型別轉換

非成員版本 data1 + data2; operator+(data1, data2); 成員版本 data1 += data2; data1.operator+=(data2); 不建議的過載 邏輯與、邏輯或、逗號的運算物件求值順序規則無法保留。 &&和||的過載版本也

QTC++資料型別轉換

Qt的資料型別與標準c++是不一樣的,在開發的時候,必然會涉及到很多資料型別的轉換。早已厭倦了百度QString轉QByteArray,QByteArray轉char*,QString轉string…。Qt的第一篇文章,就先來總結一下我用過的資料之間的轉換。 1、QString轉QByt

使用者自定義型別C#基礎型別轉換的方式

      比如現在有一個Person類,包含兩個屬性:name和age,現在我想把現在例項化一個Person類,名稱為p,我現在想把p轉換成我想要的string型別,有如下三種方式:       1、在Person類中,重寫系統定義的ToString()方法:    

c/c++c#的型別轉換

Windows Data Type .NET Data Type BOOL, BOOLEAN Boolean or Int32 BSTR String BYTE Byte CHAR Char DOUBLE Double DW

C++隱式型別轉換建構函式和關鍵字explicit

轉自公眾號:碼農有道1. 隱式型別轉換建構函式:    在《C++ Primer》這本經典教程中提到:可以用單個實參來呼叫的建構函式定義從形參型別到該類型別的一個隱式轉換。這句話看起來比較繞口挺不好理解的。我們還是結合例項來理解。#include <iostream&g