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

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

(1)在方法中

創(chuàng)新互聯(lián)公司主要從事網(wǎng)站制作、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)隴南,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):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

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

4. 異常接口聲明

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

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

(1)系統(tǒng)標(biāo)準(zhǔn)庫
![[Pasted image 20221016134510.png]]

(2)自己編寫異常類

  1. 繼承標(biāo)準(zhǔn)異常類。
  2. 該重載父類的what函數(shù)和虛析構(gòu)函數(shù)。
  3. 因?yàn)闂U归_的過程中,要復(fù)制異常類型,那么要根據(jù)你在類中添加的成員考慮是否提供自己的復(fù)制構(gòu)造函數(shù)。
    ①編寫自己的異常類
class MyOutOfRange:public exception                //繼承標(biāo)準(zhǔn)異常類
{
public:
	MyOutOfRange(const string  errorInfo)          //有參構(gòu)造string類型
	{
		this->m_Error = errorInfo;
	}
	MyOutOfRange(const char * errorInfo)           //有參構(gòu)造char *類型
	{
		this->m_Error = string( errorInfo);
	}
	virtual  ~MyOutOfRange()                        //重載虛析構(gòu)函數(shù)
	{
	}
	virtual const char *  what() const               //重載what函數(shù)
	{
		return this->m_Error.c_str() ;               //string轉(zhuǎn)char *的方法.c_str()
	}
	string m_Error;                                  //錯(cuò)誤信息
};

②異常檢測

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

③異常處理

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

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

2.cin
  1. cin.get():讀取輸入的第一個(gè)字符
  2. cin.get(ch):等價(jià)于ch=cin.get()讀取輸入的第一個(gè)字符
  3. cin.get(buf,1024):讀取輸入的長度為1024字符串buf數(shù)組中;且不會(huì)把換行符拿走(遺留在緩沖區(qū)中)
  4. cin.getline():讀取輸入的一行字符,會(huì)把換行符拿走并且扔掉
  5. cin.ignore():忽略一個(gè)字符
  6. cin.ignore(2):忽略兩個(gè)字符
  7. cin.peek():將輸入的第一個(gè)字符查看一眼,再放回緩沖區(qū),可用于判斷
  8. cin.putback():將字符放回緩沖區(qū),可用于判斷
  9. cin.fail():標(biāo)志位,0為正常,1為異常:
while(){
	....
	cin.clear();//重置標(biāo)志位
	cin.sync(); //清空緩沖區(qū)
	cout<<"標(biāo)志位是:"<
3.cout
  1. cout.flush():刷新緩沖區(qū),Linux下有效
  2. cout.put():向緩沖區(qū)寫字符
  3. cout.write():從buffer中寫num個(gè)字節(jié)到當(dāng)前輸出流中。
  4. cout.width(20);:輸出長度為20,不足補(bǔ)空格
  5. cout.fill('* ');//所有的空格處用* 填補(bǔ)
  6. cout.setf(ios::left);:左對齊
  7. cout.unsetf(ios::dec);:卸載十進(jìn)制
  8. cout.setf(ios::hex);:十六進(jìn)制
  9. cout.setf(ios::showbase);:強(qiáng)制輸出整數(shù)的基數(shù)
  10. cout.unsetf(ios::hex);:卸載十六進(jìn)制
  11. cout.setf(ios::oct);:八進(jìn)制
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)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)頁標(biāo)題:【C++】9.類型轉(zhuǎn)換,c++異常處理,輸入輸出流-創(chuàng)新互聯(lián)
路徑分享:http://muchs.cn/article30/pdppo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、商城網(wǎng)站網(wǎng)站建設(shè)、做網(wǎng)站服務(wù)器托管、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)