淺析c++中的型別轉換--static_cast
谷歌程式設計規範指出,要使用c++的型別轉換操作符,如static_cast。而堅決抵制c語言中的強制型別轉換,例如int y = (int)x。
所以,今天就來八一八c++中的型別轉換。
其中c++型別轉換運算子有:
static_cast
dynamic_cast
const_cast
reinterpret_cast
今天主要深入分析static_cast的用法。
微軟是這樣描述的:
Converts an expression to the type of type-id, based only on the types that are present in the expression.
語法如下:
static_cast ( expression )
似乎有些空洞。直白的說,static_cast操作符可用於將一個指向基類的指標轉換為指向子類的指標。但是這樣的轉換不總是安全的。
一般情況下,你可以使用static_cast用於數字型別的轉換,如把列舉轉換為int或是 float型別。
之所以講static_cast不夠安全,就是指在執行階段不進行型別檢查(和dynamic_cast相比,但是dynamic_cast也有一定的侷限性,我們以後再討論)。
具體用法:
①用於類層次結構中基類(父類)和派生類(子類)之間指標或引用的轉換。
進行上行轉換(把派生類的指標或引用轉換成基類表示)是安全的;
進行下行轉換(把基類指標或引用轉換成派生類表示)時,由於沒有動態型別檢查,所以是不安全的。
②用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。
③把空指標轉換成目標型別的空指標。
④把任何型別的表示式轉換成void型別。
注意:static_cast不能轉換掉expression的const、volatile、或者__unaligned屬性。
光說不練不行,下面就寫幾個使用static_cast的應用程式碼。
typedef unsigned char BYTE;
void f() {
char ch;
int i = 65;
float f = 2.5;
double dbl;
ch = static_cast<char>(i); // int to char
dbl = static_cast<double>(f); // float to double
i = static_cast<BYTE>(ch);
}
// static_cast_Operator_2.cpp
// compile with: /LD /GR
class B {
public:
virtual void Test(){}
};
class D : public B {};
void f(B* pb) {
D* pd1 = dynamic_cast<D*>(pb);
D* pd2 = static_cast<D*>(pb);
關於static_cast的用法就寫這些。再之後多部落格中,我們將陸續講述其他幾種型別轉換操作符,並與static_cast進行對比。
相關推薦
淺析c++中的型別轉換--static_cast
谷歌程式設計規範指出,要使用c++的型別轉換操作符,如static_cast。而堅決抵制c語言中的強制型別轉換,例如int y = (int)x。 所以,今天就來八一八c++中的型別轉換。 其中c++型別轉換運算子有: static_cast dynam
C++霧中風景11:釐清C++型別轉換(static_cast,dynamic_cast,reinterpret_cast,const_cast)
C++是一門弱型別的語言,提供了許多複雜和靈巧型別轉換的方式。筆者之前寫的Python與Go都是強型別的語言,對這種弱型別的設計實在是接受無力啊~~ ( 生活所迫,工作還得寫C++啊~~)C++語言提供了四種類型轉換的操作:static_cast,dynamic_cast,reinterpret_cast,
C語言之賦值運算中型別轉換的陷阱!
在用C編寫微控制器的程式時,在採集處理資料時,總會出現一些不正常的資料。經過數次的排查,發現大部分的問題都出現在賦值時的型別轉換問題上。C語言在賦值時的型別轉換問題是很隱蔽的,經常性地會被忽略,而這又會導致致命性的錯誤。弄清楚C語言的型別轉換的規則,至關重要!
C++ 中型別轉換 xmlChar * 與Char * 轉換,Char *與int 轉換,Char *與Float轉換,int 與portNumBits轉換
使用libxml2 得到一個節點的內容: xmlChar *value = xmlNodeGetContent(node) 1、XmlChar 轉換成Char char * stream = (char *) value; 2、Char *與 int 轉換 int
C/C++中型別轉換
C/C++中經常會使用到基本資料型別與字串(char*)型別的相互轉換,我在這裡總結一下我學到的幾種轉換方法,歡迎補充和糾錯。 一. 從其他基本資料型別到字串 方法(1): 使用stdio.h庫中的snprintf函式, 將格式化字串寫到char陣列
c++筆記之資料型別轉換
#include <iostream> #include <string> using namespace std; class Complex { public: Complex() //預設建構函式 { real = 0; imag = 0;
C++:隱式型別轉換和關鍵字explicit
《Inside the C++ Object Model》第二章開篇處有這樣一段話:“事實上關鍵字explicit之所以被匯入這個語言,就是為了給程式設計師提供一種方法,使他們能夠制止“單一引數的constructor”被當做一個conversion運算子”。 conversion運算子即型別
Java中型別轉換問題整理...
Java中型別轉換是經常遇到的問題,這裡用來更新和總結型別轉換的方法和問題,以便日後回顧: Java裡基本資料型別有哪幾種?分別佔多大記憶體?在64位JVM裡呢? 思路:8大基本資料型別,佔位長固定與系統無關。 答:8種,按長度大小依次是: byte = 8 bit ; boo
C++ 隱式類型別轉換
《C++ Primer》中提到: “可以用 單個形參來呼叫 的建構函式定義了從 形參型別 到 該類型別 的一個隱式轉換。” 這裡應該注意的是, “可以用單個形參進行呼叫” 並不是指建構函式只能有一個形參,而是它可以有多個形參,但那些形參都是有預設實參的。 那麼,什麼是“隱式轉換
c++基礎:資料型別轉換及處理(二)檔案路徑擷取檔名
繼續昨天未寫完的...我是初學者,如果覺得太簡單,勿噴,如果有什麼錯誤之處,請指出,多謝~! 今天整理了寫的根據檔案路徑擷取檔名相關程式碼,主要包含替換路徑中的“/”為“'\”,然後根據“\”擷取最後的字串,即檔名 一、字串完全替換 以下方法可以替換掉
c++基礎:資料型別轉換及處理(一)string轉wstring及檔案拷貝
使用java太長時間,已經習慣了其資料型別轉換及處理的便捷。但是,現在使用c++,不得不去面對其資料型別轉換,以及相關的處理。瞬間感覺奔潰,一天中,很多時間都交給度娘了... 檔案拷貝 本來很方便,提供了CopyFile,但是看到入參,瞬間崩潰,普通字串不行
[C++] 過載運算子與型別轉換(2)——函式呼叫運算子和型別轉換運算子
1、這兩個應該是C++中比較高階的用法了。 一、函式呼叫運算子 1、過載函式呼叫運算子(),必須是成員函式,一個類可以定義多個不同版本的呼叫運算子,相互之間應該在引數數量或者型別上有所區別。 2、定義了呼叫運算子的類的物件稱作 函式物件;函式
C++ 4種強制型別轉換
C++的型別轉換符:static_cast、dynamic_cast、reinterpret_cast、和const_cast 形式:class_name <type>(expression) ,其中class_name為以上4種,type是轉換的
c++ 指標的強制型別轉換
如果有一個指標 int *p=new int ; 這句話的意思是1、宣告一個指向int型變數的指標p,2、new動態申請一塊int 大小的記憶體,並將p指向這塊記憶體。 對p進行強制型別轉換時,我們可以通過(TYPE *)p操作進行。 (TYPE*)p強制型別轉換的結果是
c++之超越c的語法02-型別轉換
c++的型別轉換和c有一些不同: c style:(type)value printf("%d",(int)2.5); C++style: static_cast<type>value cout << static_cast<double
C++之基本資料型別轉換和轉換函式
基本資料型別轉換 C++語言中型別轉換有兩種:隱式轉換和強制轉換。在型別轉換的過程中還有保值轉換和非保值轉換之分。保值轉換是安全的,資料精度不會受到損失,如資料型別有低向高轉換;非保值轉換是不安全的,
C#的隱式型別轉換和顯式型別轉換
C#的隱式型別轉換和顯式型別轉換 C#的隱式型別轉換 在C#語言中,一些預定義的資料型別之間存在著預定義的轉換。比如,從int型別轉換到long型別。C#語言中資料型別的轉換可以用分為兩 類:隱式轉換(implicit conversions)和顯式轉換(expli
C# 幾種資料型別轉換
1.(int)變數名[強制型別轉換] 該轉換方式主要用於數字型別之間的轉換,從int型別向long,float,double,decimal 型別轉換可以使用隱式轉換,但從long型到int 就需要使用顯示轉換,即使用該型別的轉換方式否則產生編譯錯誤。 該
java中型別轉換那種效能最優
我們以String轉換為Integer為例,測試一下。 需要注意的是Ints.tryParse()方法用的google guava類庫;NumberUtils來自commons-lang類庫。 測試程
【C++學習筆記】型別轉換和跳轉語句
一、型別轉換 在C++語言中,如果兩種型別由關聯,那麼當程式需要其中一種型別的運算物件時,可以用另一種型別的物件或值來替代,即如果如果兩種型別可以相互轉換(conversion),那麼它們就是關聯的。下面的例子中會先根據型別轉換規則設法將運算物件的型別統一