C++小記(八)

關鍵詞:類型轉換,異常拋出,輸入輸出流

強制類型轉換

   在C語言中,任意類型之間都能進行強制類型轉換,所以導致了C語言中強轉過於粗暴,難於定位的 特點,在程序設計理論中強制類型轉換是不被推薦的,應儘量避免使用。

C++中同樣有強制類型轉換,只不過相較於C語言,C++將強制類型轉換封裝成了幾種關鍵字:

  • static_cast<T>(expr)
  • reinterpret_cast<T>(expr) 
  • dynamic_cast<T>(expr)
  • const_cast<T>(expr)

static_cast<T>(expr)

            

 static_cast有個重點注意:無法用於普通指針變量之間的類型轉換

reinterpret_cast<T>(expr) 

 

dynamic_cast<T>(expr)

  • dynamic_cast主要用於類層次間的轉換,還可用於類之間的交叉轉換
  • 具有類型檢查功能,比static_cast更安全,用法同static_cast

const_cast<T>(expr)

const_cast主要用於去除const屬性

 

/*********************************************************************************************************/

 

異常處理機制

     異常是一種程序控制機制,與函數機制獨立和互補,函數是一種以棧結構展開的上下函數銜接的程序控制系統,異常是另一種控制結構,它依附於棧結構,卻可以同時設置多個異常類型作爲網捕條件,從而以類型匹配在棧機制中跳躍回饋。

異常的基本語法:

  1.      若有異常則通過throw操作創建一個異常對象並拋擲。
  2.  將可能拋出異常的程序段嵌在try塊之中。控制通過正常的順序執行到達try語句,然後執行try塊內的保護段。
  3.  如果在保護段執行期間沒有引起異常,那麼跟在try塊後的catch子句就不執行。程序從try塊後跟隨的最後一個catch子句後面的語句繼續執行下去。
  4. catch子句按其在try塊後出現的順序被檢查。匹配的catch子句將捕獲並處理異常(或繼續拋擲異常)。
  5.  如果匹配的處理器未找到,則運行函數terminate將被自動調用,其缺省功能是調用abort終止程序。
  6. 處理不了的異常,可以在catch的最後一個分支,使用throw語法,向上扔。
  7. 異常機制與函數機制互不干涉,但捕捉的方式是基於類型匹配。捕捉相當於函數返回類型的匹配,而不是函數參數的匹配,所以捕捉不用考慮一個拋擲中的多種數據類型匹配問題
  8.  異常捕捉嚴格按照類型匹配 
  9. 異常捕捉的類型匹配之苛刻程度可以和模板的類型匹配媲美,它不允許相容類型的隱式轉換,比如,拋擲char類型用int型就捕捉不到
//double division(int x, int y);      //函數聲明,可以拋出任何異常
//double division(int x, int y) throw(); //不可以跑出任何異常
double division(int x, int y)throw(int, char);//可以拋出int,char類型的異常

double division(int x, int y)
{
	if (y == 0)
	{
		throw 0;         //throw對異常情況進行拋出,拋出類型自定義
		//throw 'e';
	}

	return x / y;
}


int main()
{
	int a, b;
	cin >> a >> b;
	try                          //try對可能出現異常的語句進行性嘗試
	{
		cout << division(a, b) << endl;
	}
	catch (int)                  //catch根據拋出異常的類型進行匹配,執行相應的異常處理
	{
		cout << "int 0 exception" << endl;
	}
	catch (char)
	{
		cout << "char 0 exception" << endl;
	}
}

棧解旋:

      異常被拋出後,從進入try塊起,到異常被拋擲前,這期間在棧上的構造的所有對象,都會被自動析構。析構的順序與構造的順序相反。這一過程稱爲棧的解旋(unwinding)。

 

/*********************************************************************************************************/
 

輸入輸出流

C++輸入輸出包含以下三個方面的內容:

  1.     對系統指定的標準設備的輸入和輸出。即從鍵盤輸入數據,輸出到顯示器屏幕。這種輸入輸出稱爲標準的輸入輸出,簡稱標準I/O。
  2.     以外存磁盤文件爲對象進行輸入和輸出,即從磁盤文件輸入數據,數據輸出到磁盤文件。以外存文件爲對象的輸入輸出稱爲文件的輸入輸出,簡稱文件I/O。
  3.     對內存中指定的空間進行輸入和輸出。通常指定一個字符數組作爲存儲空間(實際上可以利用該空間存儲任何信息)。這種輸入和輸出稱爲字符串輸入輸出,簡稱串I/O。
     
  • 在C++的輸入輸出中,編譯系統對數據類型進行嚴格的檢查,凡是類型不正確的數據都不可能通過編譯。因此C++的I/O操作是類型安全(type safe)的。C++的I/O操作是可擴展的,不僅可以用來輸入輸出標準類型的數據,也可以用於用戶自定義類型的數據。
  •       C++通過I/O類庫來實現豐富的I/O功能。這樣使C++的輸人輸出明顯地優於C 語言中的printf和scanf,但是也爲之付出了代價,C++的I/O系統變得比較複雜,要掌握許多細節。
  •       C++編譯系統提供了用於輸入輸出的iostream類庫。iostream這個單詞是由3個部 分組成的,即i-o-stream,意爲輸入輸出流。

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章