真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

【C++】9.類型轉換,c++異常處理,輸入輸出流-創(chuàng)新互聯(lián)

1. 靜態(tài)轉換 static_cast
  1. 用于類層次結構中基類(父類)和派生類(子類)之間指針或引用的轉換。
    • 進行上行轉換(把派生類的指針或引用轉換成基類表示)是安全的;
      • Base *base=static_cast(base);
      • 把Child轉為Base * ,是向上轉化,安全!
    • 進行下行轉換(把基類指針或引用轉換成派生類表示)時,由于沒有動態(tài)類型檢查,所以是不安全的。
      • Child * child=static_cast(child)
      • 將Base轉為Child * ,是向下轉換,不安全!
  2. 用于基本數(shù)據(jù)類型之間的轉換,如把int轉換成char,把char轉換成int。這種轉換的安全性也要開發(fā)人員來保證:double b = static_cast(int a);
2. 動態(tài)轉換 dynamic_cast
  1. dynamic_cast主要用于類層次間的上行轉換和下行轉換;不支持基礎數(shù)據(jù)類型.
  2. 在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;
  3. 在進行下行轉換時,dynamic_cast具有類型檢查的功能,比static_cast更安全;
3. 常量轉換const_cast
該運算符用來修改對象的const屬性
不能直接對非指針和非引用的變量使用const_cast操作符去直接移除它的const.
  1. 常量指針被轉化成非常量指針,并且仍然指向原來的對象;
const int* p = _NULL_;          //p本來是常量指針
int* np = const_cast(p);  //取出const,將常量指針被轉化成非常量指針
  1. 非常量指針被轉換成常量指針,并且仍然指向原來的對象;
int* pp = _NULL_;                                 //p本來是非常量
const int* npp = const_cast(pp);      //加上const,將非常量指針轉換為常量指針
  1. 引用同理.
  2. 不能對非指針非引用的變量進行常量轉換!
4.重新解釋轉換 reinterpret_cast
  1. 這是最不安全的一種轉換機制,最有可能出問題。
  2. 主要用于將一種數(shù)據(jù)類型從一種類型轉換為另一種類型。它可以將一個指針轉換成一個整數(shù),也可以將一個整數(shù)轉換成一個指針.
5.C++異常
將[問題檢測]和[問題處理]相分離
由[問題檢測代碼]可以拋出(throw)一個對象給[問題處理代碼],通過這個對象的類型和內(nèi)容,實際上完成了兩個部分的通信,通信的內(nèi)容是“出現(xiàn)了什么錯誤”。
1. 語法:
try{
	.....//要試圖執(zhí)行的部分
}catch(捕獲類型){
	//throw;向上拋出
	......//異常處理
}//如果沒有任何處理異常的地方,那么成員調(diào)用Terminate函數(shù),終止程序
2. 異常嚴格類型匹配

(1)在方法中

創(chuàng)新互聯(lián)公司主要從事網(wǎng)站制作、成都網(wǎng)站建設、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務隴南,10年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18982081108
void TestFunction**(){**
cout **<<** "開始拋出異常..." **<<** endl**;**
//throw 10; //拋出int類型異常
//throw 'a'; //拋出char類型異常
//throw "abcd"; //拋出char*類型異常
//throw myException();//拋出自定義異常(匿名對象)
}

(2)在main中

try{
		TestFunction();
	}
	catch (int){
		cout<< "拋出Int類型異常!"<< endl;
	}
	catch (char){
		cout<< "拋出Char類型異常!"<< endl;
	}
	catch (char*){
		cout<< "拋出Char*類型異常!"<< endl;
	}
	catch (string){
		cout<< "拋出string類型異常!"<< endl;
	}
	catch(MyException e){//拋出自定義異常
		e.printError();
	}
	//捕獲所有異常
	catch (...){
		cout<< "拋出其他類型異常!"<< endl;
	}
3. 棧解旋unwinding

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

4. 異常接口聲明

(1)只能拋出int類型異常:void func() throw(int){}
(2)能拋出類型A,B,C及其子類型的異常:void func() throw(A,B,C){}
(3)不拋任何類型異常:void func() throw(){}
(4)如果一個函數(shù)拋出了它的異常接口聲明所不允許拋出的異常,unexcepted函數(shù)會被調(diào)用,該函數(shù)默認行為調(diào)用terminate函數(shù)中斷程序。

5. 異常變量生命周期
  1. 如果 MyException e, 會多開銷一份數(shù)據(jù),調(diào)用拷貝構造。
  2. 如果MyExcepiton* e,不new 提前釋放對象;new自己管理delete
  3. 推薦MyException&e 容易些而且就一份數(shù)據(jù)
6.異常的多態(tài)使用 6.C++標準異常庫

(1)系統(tǒng)標準庫
![[Pasted image 20221016134510.png]]

(2)自己編寫異常類

  1. 繼承標準異常類。
  2. 該重載父類的what函數(shù)和虛析構函數(shù)。
  3. 因為棧展開的過程中,要復制異常類型,那么要根據(jù)你在類中添加的成員考慮是否提供自己的復制構造函數(shù)。
    ①編寫自己的異常類
class MyOutOfRange:public exception                //繼承標準異常類
{
public:
	MyOutOfRange(const string  errorInfo)          //有參構造string類型
	{
		this->m_Error = errorInfo;
	}
	MyOutOfRange(const char * errorInfo)           //有參構造char *類型
	{
		this->m_Error = string( errorInfo);
	}
	virtual  ~MyOutOfRange()                        //重載虛析構函數(shù)
	{
	}
	virtual const char *  what() const               //重載what函數(shù)
	{
		return this->m_Error.c_str() ;               //string轉char *的方法.c_str()
	}
	string m_Error;                                  //錯誤信息
};

②異常檢測

if (age<= 0 || age >150)
{
//拋出異常 越界
//throw  out_of_range("年齡必須在0~150之間");          //標準庫中的越界異常
//throw length_error("長度異常");                     //標準庫中的長度異常
throw MyOutOfRange(("我的異常 年齡必須在0~150之間"));   //自己編寫的異常
}

③異常處理

try
	{
		Person p(151);                 //這里年齡越界
	}
	catch ( out_of_range & e )         //標準庫中的越界異常
	{
		cout<< e.what()<< endl;
	}
	catch (length_error & e)            //標準庫中的長度異常
	{
		cout<< e.what()<< endl;
	}
	catch (MyOutOfRange e)               //自己編寫的異常
	{
		cout<< e.what()<< endl;
	}
7.輸入輸出流 1.流的概念和流類庫的結構

(1)標準I/O:標準設備的輸入和輸出
![[Pasted image 20221017091745.png]]
![[Pasted image 20221017091803.png]]
(2)文件I/O: 以外存磁盤文件為對象進行輸入和輸出
![[Pasted image 20221017092011.png]]
(3)(字符)串I/O:對內(nèi)存中指定的空間進行輸入和輸出,通常指定一個字符數(shù)組作為存儲空間

2.cin
  1. cin.get():讀取輸入的第一個字符
  2. cin.get(ch):等價于ch=cin.get()讀取輸入的第一個字符
  3. cin.get(buf,1024):讀取輸入的長度為1024字符串buf數(shù)組中;且不會把換行符拿走(遺留在緩沖區(qū)中)
  4. cin.getline():讀取輸入的一行字符,會把換行符拿走并且扔掉
  5. cin.ignore():忽略一個字符
  6. cin.ignore(2):忽略兩個字符
  7. cin.peek():將輸入的第一個字符查看一眼,再放回緩沖區(qū),可用于判斷
  8. cin.putback():將字符放回緩沖區(qū),可用于判斷
  9. cin.fail():標志位,0為正常,1為異常:
while(){
	....
	cin.clear();//重置標志位
	cin.sync(); //清空緩沖區(qū)
	cout<<"標志位是:"<
3.cout
  1. cout.flush():刷新緩沖區(qū),Linux下有效
  2. cout.put():向緩沖區(qū)寫字符
  3. cout.write():從buffer中寫num個字節(jié)到當前輸出流中。
  4. cout.width(20);:輸出長度為20,不足補空格
  5. cout.fill('* ');//所有的空格處用* 填補
  6. cout.setf(ios::left);:左對齊
  7. cout.unsetf(ios::dec);:卸載十進制
  8. cout.setf(ios::hex);:十六進制
  9. cout.setf(ios::showbase);:強制輸出整數(shù)的基數(shù)
  10. cout.unsetf(ios::hex);:卸載十六進制
  11. cout.setf(ios::oct);:八進制
4. 文件讀寫
  1. 頭文件:#include
  2. 寫文件OFS:
ofstream ofs;
ofs.open("./test.txt",ios:out | ios:trunc);
//ofs.is_open();判斷能否打開成功
ofs<<"write something here"<
  1. 讀文件IFS:
ifstream ifs;
ifs.open("./test.txt",ios:in);
//ifs.is_open();判斷能否打開成功

//第一種右移讀文件方式,推薦
char buf[1024];
while(ifs>>buf){
	cout<

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


網(wǎng)站題目:【C++】9.類型轉換,c++異常處理,輸入輸出流-創(chuàng)新互聯(lián)
標題鏈接:http://weahome.cn/article/pdppo.html

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部