1. 程式人生 > >c++中的4種顯式型別的轉換

c++中的4種顯式型別的轉換

1.概述

tatic_cast:用於“良性”和“適度良性”的轉換,包括不用強制轉換

const_cast:用於“const”和/或“volatile”進行轉換

reinterpret_cast:轉換為完全不同的意思。為了安全的使用它,關鍵必須轉換回原來的型別。轉換成的型別一般只能用於位操作,否則就是為了其他隱祕的目的。這是所有轉換中最危險的。

dynamic_cast:用於型別安全的向下轉換


-----常用-----

static_cast:用於所有明確定義的轉換,包括void*的強制轉換、隱式型別轉換、類層次的靜態定位。

(1) 資料型別由小到大的轉換,比如int轉換為long或float;

int i ; static_cast<long>(i); static_cast<float>(i);

(2) 窄化轉換,即資料型別由大到小的轉換,可能丟失資料;

(3)c++中是不允許對一個void*型別的資料賦值的;

void* ptr;  ptr = static_cast<void*>(i);

int* p = static_cast<int*>(malloc(100));
const_cast:常量轉換,如果從const轉換為非const或從volatile轉換為非volatile,可以使用const_cast。這是const_cast唯一允許的轉換。
volatile int k = 0;   int* u = const_cast<int*>(&k);

2.四種顯式轉換型別示例

(1)reinterpret_cast

型別轉換函式將一個型別的指標,轉換為另一個型別的指標。這種轉換不需要修改指標變數值資料存放格式,只需在編譯時重新編譯解釋指標的型別就可。

double d=9.3;
double *pd=&d;
int *pi=reinterpret_cast<int*>(pd);
但是不能用於非指標型別的轉換。同隱式轉換一樣,reinterpret_cast也不能將一個const指標轉換為void*指標。
(2)const_cast

用於去除指標變數的常量屬性,將它轉換為一個對應指標型別的普通變數。也可以將一個非常量的指標變數轉換為一個常指標變數,在編譯期間做出型別更改。

const int* pci=0;
int* pj=const_cast<int*>(pci);

(3)static_cast

用於基本型別之間和具有繼承關係的型別之間的轉換,這種轉換一般會更改變數的內部表示方式。用於指標型別轉換,沒有太大意義。

class Base();
class Derived:public Base{}
Derived d;
Base d=static_cast<Base>(d);
可將繼承類物件轉換為基類物件。但是反過來不行。注意:基類指標轉換為繼承類指標,在一定的危害性。

(4)dynamic_cast

與static_cast相對,是動態dynamic_cast轉換。這種轉換是在執行時進行轉換分析的,並非在編譯時進行。只能在繼承類物件的指標之間或引用之間進行型別轉換。進行轉換時,會根據當前(RTTI)判斷型別物件之間的轉換是否合法。dynamic_cast轉換失敗,是通過是否為null指標檢測;引用轉換失敗,丟擲bad_cast異常。
將繼承類指標或引用轉換為基類指標或引用可以,反過來一般不行;但是如果基類中有虛擬函式也可以,也就是說被轉換的類具有虛擬函式的物件指標時,編譯也通過。

class Base();
class Derived:public Base{}
Derived *pd=new Derived;
Base *d=dynamic_cast<Base*>(pd);
此外,如果沒有繼承關係,但是被轉換的類具有虛擬函式的物件指標時,轉換也可編譯通過。

相關推薦

c++4型別轉換

1.概述 tatic_cast:用於“良性”和“適度良性”的轉換,包括不用強制轉換 const_cast:用於“const”和/或“volatile”進行轉換 reinterpret_cast:轉換為完全不同的意思。為了安全的使用它,關鍵必須轉換回原來的型別。轉換

C++ 型別轉換運算子

1、static_cast: 相當於C語言可以進行的隱式轉換。 2、reinterpret_cast: 相當於C語言不可以進行的隱式轉換。 (static_cast與reinterpret_cast結

C#的隱型別轉換型別轉換

C#的隱式型別轉換和顯式型別轉換 C#的隱式型別轉換     在C#語言中,一些預定義的資料型別之間存在著預定義的轉換。比如,從int型別轉換到long型別。C#語言中資料型別的轉換可以用分為兩 類:隱式轉換(implicit conversions)和顯式轉換(expli

建構函式建立隱物件作為引數 / 使用函式表示法的型別轉換

看個建構函式建立隱式物件作為引數的例子 #include<iostream> using namespace std; class A { int a; int b; public: A() { cout << "建構函式" << endl; };

隱/型別轉換辨析

預備 高階與低階型別 byte<short<int<long<float<double 隱式型別轉換 從低階型別向高階型別的轉換,系統將自行執行轉換。此型別轉換為隱式型別轉換。 例: int x=50; //宣

C++static_cast和dynamic_cast強制型別轉換

轉載地址:http://blog.csdn.net/qq_26849233/article/details/62218385 一、static_cast關鍵字(編譯時型別檢查) 用法:static_cast < type-id > (expression

JavaScript型別轉換與隱型別轉換

本文談談JavaScript的型別轉換,我們知道在JavaScript中宣告變數不需指定型別, 對變數賦值也沒有型別檢查,同時JavaScript允許隱式型別轉換。這些特徵說明JavaScript屬於弱型別的語言。 在強型別的C++中,多數情況下建構函式需要宣告為exp

從"void*"到指向非"void"的指標的轉換要求型別轉換錯誤

錯誤程式碼:struct People * p = malloc(sizeof(struct People));正確程式碼:struct People * p = ( People *)malloc(sizeof(struct People));

python4函式的型別

(1)無引數,無返回值的函式此類函式,不能接收引數,也沒有返回值格式:def 函式名():    程式碼邏輯 函式名()例:def my_print(): print("hello world") my_print()(2)無引數,有返回值的函式此類函式,不能接收引數

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

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

C#方法轉換字串變成數值型別

    第一種方法:convert.to…的方法     直接看例題就行:     第二種方法: int.parse(string)方法     再舉例:     第三種方法:int

c++強制型別轉換(const_cast、static_cast應用最多)

c++動態型別轉換有四種const_cast、static_cast、dynamic_cast、reinterpreter_cast 前面兩個用的多,但是後面的針對其設計理念有許多其他的實現方法可達到同樣的效果 1. static_cast (1)用於基

C++:隱型別轉換和關鍵字explicit

《Inside the C++ Object Model》第二章開篇處有這樣一段話:“事實上關鍵字explicit之所以被匯入這個語言,就是為了給程式設計師提供一種方法,使他們能夠制止“單一引數的constructor”被當做一個conversion運算子”。 conversion運算子即型別

C++隱型別轉換 operator

在Win32 SDK, 該API函式原型為 BOOL GetClientRect( HWND hWnd, // 視窗控制代碼 LPRECT lpRect // 客戶區座標 ); 在MFC中,該函式的原型為void

JavaScript的隱型別轉換

最近在學習渡一教育的JavaScript精品課,成哥講的還是很棒的,開這個系列記錄下學習筆記 本次學習筆記,對應web前端開發JavaScript精英課js的第六課時   目錄  一.is NaN()  二.++ -- 自增自減運算子 &nb

C++進階--隱型別轉換

//############################################################################ /* 隱式型別轉換 * * 型別轉換可分為: * 隱式

15 More Effectic C++ ——條款21/22(過載防止隱型別轉換/使用複合操作符)

1 看不見的隱式型別轉換 當建構函式只有一個,編譯器會利用建構函式進行隱式型別轉換。如下面所示: class UInt { public: UInt(); UInt(int value); } UInt a = 0, b(0), c = 1; // 隱式轉換:int變成UI

C語言進階學習1 隱型別轉換和強制型別轉換

本部落格記錄狄泰學院課程的學習 學習交流群:320628659 個人QQ:1367087622 歡迎大家交流學習 本章的學習目標: 學習隱式型別轉換和強制型別轉換的基本概念. 本意或非本意下使用型別轉換時可能會出現的問題. 在C語言是可以進行型別之間的轉換且其中存在兩種型別

C#DateTime的DayOfWeek、DayOfYear轉換為Int型別

首先建立一個DateTime類的物件,並初始化: DateTime dt=new DateTime(2012,12,12); DayOfWeek與DayOfYear都是DateTime類的屬性, 其中DayOfWeek為列舉型別: 而DayOfYear為Int型別(可

C++------隱型別轉換

隱式型別轉換的定義: “可以用 單個形參來呼叫 的建構函式定義了從 形參型別 到 該類型別 的一個隱式轉換。” 這裡應該注意的是, “可以用單個形參進行呼叫” 並不是指建構函式只能有一個形參,而是它可以有多個形參,但那些形參都是有預設實參的。 那麼,什麼是“隱式轉換”呢? 上面這句話也說了,