類的類型轉換和轉換函數

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++》)。
相關文章
相關標籤/搜索