1. 程式人生 > >淺析c++中的型別轉換--static_cast

淺析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進行對比。

[email protected]

相關推薦

淺析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),那麼它們就是關聯的。下面的例子中會先根據型別轉換規則設法將運算物件的型別統一