1、概述函數
不一樣基本數據類型間能夠進行類型轉換。有的能夠自動類型轉換,例如將int類型值賦值給long型變量。對於徹底不兼容的類型,若是要進行類型轉換隻能經過強制類型轉換。一樣的,類類型也能夠與其餘數據類型進行類型轉換。設計
2、自動類型轉換對象
若是類定義了一個構造函數,這個構造函數只有一個參數,則能夠將參數對應類型的變量自動轉換爲類類型。例如:ci
class String字符串
{編譯器
String ( const char* p ); // 用C風格的字符串p做爲初始化值
//…
}
String s1 = 「hello」; //隱式轉換,先將「hello」自動轉換爲一個String的臨時變量,再賦值給s1,等價於String s1 = String(「hello」);
3、explicit防止自動轉換
explicit用於類的構造函數中,用於防止自動類型轉換,若是要轉換,只能強制類型轉換。explicit能夠有效得防止構造函數的隱式轉換帶來的錯誤或者誤解。例如:
class String
{
String ( int n ); //本意是預先分配n個字節給字符串
}
下面兩種寫法就比較疑惑了:
String s4 = 10; //編譯經過,也是分配10個字節的空字符串,可是這種寫法容易讓人產生疑惑
爲了不這種錯誤的發生,使用explicit關鍵字:
class String
{
explicit String ( int n );
}
String s4 = 10; //編譯不經過,不容許隱式的轉換
String s2(10); //編譯經過
4、轉換函數
轉換函數是用戶定義的強制類型轉換,能夠將類類型轉換爲其餘類型。轉換函數的定義以下:
operator typeName();
例如:operator double();
轉換函數必須知足以下幾點:
(1)轉換函數必須是類方法
(2)轉換函數不能指定返回類型
(3)轉換函數不能有參數
例如:
class Integer
{
public:
operator int() const;
private:
int m_nValue;
}
使用Interger時:
Interger objInt;
int nValue = objInt; //能夠直接將Interger類型對象賦值給int型變量 轉換函數過於強大,極不容易肯定編譯器爲咱們作了什麼,出現問題後,不容易定位,因此須要轉換時,建議將轉換函數設計成一種asType()的函數形式,就像std::string中的成員函數c_str同樣,提供一個函數,而不是一個轉換(《More Effective C++》)。