個(gè)人覺得學(xué)習(xí)編程最有效的方法是閱讀專業(yè)的書籍,通過閱讀專業(yè)書籍可以構(gòu)建更加系統(tǒng)化的知識(shí)體系。
一直以來都很想深入學(xué)習(xí)一下C++,將其作為自己的主力開發(fā)語言?,F(xiàn)在為了完成自己這一直以來的心愿,準(zhǔn)備認(rèn)真學(xué)習(xí)《C++ Primer Plus》。
為了提高學(xué)習(xí)效率,在學(xué)習(xí)的過程中將通過發(fā)布學(xué)習(xí)筆記的方式,持續(xù)記錄自己學(xué)習(xí)C++的過程。
友元聲明可以位于公有、私有或保護(hù)部分,位置無關(guān)緊要。
通過如下代碼,可以將Remote
類聲明為Tv
類的友元類:
class Tv
{friend class Remote;
...
}
class Remote
{...
}
2、友元成員函數(shù)讓Remote::set_chan()
稱為Tv
類的友元的方法是,在Tv
類聲明中將其聲明為友元:
class Tv
{friend void Remote::set_chan(Tv & t, int c);
...
}
為了解決定義位置循環(huán)依賴的問題,需要使用向前聲明(forward declaration)。為此需要這樣進(jìn)行排列:
class Tv;//向前聲明
class Remote{...};
class Tv{...};
3、其他友元關(guān)系讓類彼此成為對方的友元來實(shí)現(xiàn)。
4、共同的友元函數(shù)需要訪問兩個(gè)類的私有數(shù)據(jù)時(shí)。
二、嵌套類在另一個(gè)類中聲明的類被稱為嵌套類(nested class),它通過提供新的類型類作用與來避免名稱混亂。包含類的成員函數(shù)可以創(chuàng)建和使用被嵌套類的對象;而僅當(dāng)聲明位于公有部分,才能在包含類的外面使用嵌套類,而且必須使用作用域解析運(yùn)算符。
1、嵌套類和訪問權(quán)限嵌套類、結(jié)構(gòu)和枚舉的作用域特征:
聲明位置 | 包含它的類是否可以使用它 | 從包含它的類派生而來的類是否可以使用它 | 在外部是否可以使用 |
---|---|---|---|
私有部分 | 是 | 否 | 否 |
保護(hù)部分 | 是 | 是 | 否 |
公有部分 | 是 | 是 | 是,通過類限定符來使用 |
對嵌套類的訪問控制權(quán)的控制規(guī)則與常規(guī)類相同。
2、模板中的嵌套將類定義轉(zhuǎn)換為模板時(shí),不會(huì)由于它包含嵌套類帶來問題。
3、異常(1) 調(diào)用abort()
abort()
函數(shù)的原型位于頭文件cstdlib
(或stdlib.h
)中,其典型實(shí)現(xiàn)是向標(biāo)準(zhǔn)錯(cuò)誤流(即cerr
使用的錯(cuò)誤流)發(fā)送消息abnomal program termination
(程序異常終止),然后終止程序。它還返回一個(gè)隨實(shí)現(xiàn)而異的值,告訴操作系統(tǒng)(或父級進(jìn)程),處理失敗。
(2)返回錯(cuò)誤碼
一種比異常終止更靈活的方法是,使用函數(shù)的返回值來指出問題。
(3)異常機(jī)制
C++異常時(shí)對程序運(yùn)行過程中發(fā)生的異常情況的一種響應(yīng)。異常提供了將控制權(quán)從程序的一個(gè)部分傳遞到另一個(gè)部分的途徑。對異常的處理由3個(gè)部分組成:
try
塊。throw
關(guān)鍵字表示引發(fā)異常,緊隨其后的值(例如字符串和對象)指出了異常的特征。catch
關(guān)鍵字表示捕獲異常。try
塊標(biāo)識(shí)其中特定的異??赡鼙患せ畹拇a塊,它后面跟一個(gè)或多個(gè)catch
塊。
try{uint z = 1 - 2;
}
catch
{std::cout<< "計(jì)算結(jié)果超出范圍"<
執(zhí)行throw
語句類似于執(zhí)行返回語句,因?yàn)樗矊⒔K止函數(shù)的執(zhí)行;但不是將控制權(quán)返回給調(diào)用程序,而是導(dǎo)致程序沿函數(shù)調(diào)用序列后退,直到找到包含try
塊的函數(shù)。
(4)將對象用作異常類型
通常,引發(fā)異常的函數(shù)將傳遞一個(gè)對象。這樣做得重要優(yōu)點(diǎn)之一是,可以使用不同的異常類型來區(qū)分不同的函數(shù)在不同情況下引發(fā)的異常。另外,對象可以攜帶信息,程序員可以根據(jù)這些信息來確定引發(fā)異常的原因。同時(shí),catch
塊可以根據(jù)這些信息來決定采取什么措施。
(5) 異常規(guī)范和C++11
C++98新增,C++11已摒棄。
(6)棧解退
假設(shè)try
塊設(shè)有直接調(diào)用引發(fā)異常的函數(shù),而是調(diào)用了對引發(fā)異常的函數(shù)進(jìn)行調(diào)用的函數(shù),則程序流程將從引發(fā)異常的函數(shù)跳到包含try
塊和處理程序的函數(shù)。這涉及到棧解退(unwinding the stack)。
(7)其他異常特性
引發(fā)異常時(shí)編譯器總是創(chuàng)建一個(gè)臨時(shí)拷貝,即使異常規(guī)范和catch
塊中指定的是引用。
基類引用可以執(zhí)行派生類對象。
應(yīng)將捕獲位于層次結(jié)構(gòu)最下面的異常類的catch
語句放在最前面,將捕獲基類異常的catch
語句放在最后面。
使用省略號(hào)來表示異常類型,從而捕獲任何異常:
catch(…)
{//statements
}
在catch
語句中使用基類對象時(shí),將捕獲所有的派生類對象,但派生特性將被剝?nèi)?,因此將使用虛方法的基類版本?/p>
(8)exception
類exception
頭文件(以前為exception.h
或except.h
)定義了exception
類,C++可以把它用作其他異常類的基類。
C++提供了一種在失敗時(shí)返回空指針的new
:
int * pi = new (std::nothrow) int;
(9)異常、類和繼承
異常、類和繼承以三種方式相互關(guān)聯(lián)。首先,可以像標(biāo)準(zhǔn)C++庫所做的那樣,從一個(gè)異常類派生出另個(gè)一個(gè);其次,可以在類定義中嵌套異常類聲明來組合異常;最后,這種嵌套聲明本身可被繼承,還可用作基類。
(10) 異常何時(shí)會(huì)迷失方向
雖然C++11摒棄了異常規(guī)范,但仍支持它,且有些現(xiàn)有的代碼使用了它。
(11)有關(guān)異常的注意事項(xiàng)
使用異常會(huì)增加程序代碼,降低程序的運(yùn)行速度。異常規(guī)范不適用于模板,因?yàn)槟0搴瘮?shù)引發(fā)的異??赡茈S特定的具體化而異。異常和動(dòng)態(tài)內(nèi)存分配并非總能協(xié)同工作。
RTTI是運(yùn)行階段類型識(shí)別(Runtime Type Identification)的簡稱。這是新添加到C++中的特性之一,很多老式實(shí)現(xiàn)不支持。
C++有3個(gè)支持RTTI的元素。
dynamic_cast
運(yùn)算符將使用一個(gè)指向基類的指針來生成一個(gè)指向派生類的指針;否則,該運(yùn)算符返回0——空指針。typeid
運(yùn)算符返回一個(gè)指出對象的類型的值。type_info
結(jié)構(gòu)存儲(chǔ)了有關(guān)特定類型的信息。Superb * pm = dynamic_cast(pg);
五、類型轉(zhuǎn)換運(yùn)算符類型轉(zhuǎn)換運(yùn)算符:
dynamic_cast
const_cast
static_cast
reinterpret_cast
你是否還在尋找穩(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)查看詳情吧
本文標(biāo)題:C++PrimerPlus學(xué)習(xí)筆記之友元、異常和其他-創(chuàng)新互聯(lián)
本文鏈接:http://jinyejixie.com/article10/dedhdo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、網(wǎng)站改版、響應(yīng)式網(wǎng)站、建站公司、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站內(nèi)鏈
聲明:本網(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)
猜你還喜歡下面的內(nèi)容