C++風(fēng)格與技巧說明介紹
C++作為一種編程語言,僅僅是它的語法、特性、標(biāo)準(zhǔn)類庫就已經(jīng)是一項(xiàng)非常難理解的東西了,所以在開始接觸時(shí),一定要打下良好的代碼,這樣才會給今后的學(xué)習(xí)帶來便捷的道路。下面說一下C++風(fēng)格與技巧問題。
早在1981年,我就指出,通過將我必須顯式地跟蹤的對象的數(shù)量從幾萬個(gè)減少到幾打,為了使程序正確運(yùn)行而付出的努力從可怕的苦工,變成了應(yīng)付一些可管理的對象,甚至更加簡單了。如果你的程序還沒有包含將顯式內(nèi)存管理減少到最小限度的庫,那么要讓你程序完成和正確運(yùn)行的話,最快的途徑也許就是先建立一個(gè)這樣的庫。
- #include<memory>
- #include<iostream>
- using namespace std;
- struct S {
- S() { cout << "make an S\n"; }
- ~S() { cout << "destroy an S\n"; }
- S(const S&) { cout << "copy initialize an S\n"; }
- S& operator=(const S&) { cout << "copy assign an S\n"; }
- };
模板和標(biāo)準(zhǔn)庫實(shí)現(xiàn)了容器、資源句柄以及諸如此類的東西,更早的使用甚至在多年以前。異常的使用使之更加完善。如果你實(shí)在不能將內(nèi)存分配/重新分配的操作隱藏到你需要的對象中時(shí),你可以使用資源句柄(resource handle),以將內(nèi)存泄漏的可能性降至最低。
這里有個(gè)例子:我需要通過一個(gè)函數(shù),C++風(fēng)格與技巧在空閑內(nèi)存中建立一個(gè)對象并返回它。這時(shí)候可能忘記釋放這個(gè)對象。畢竟,我們不能說,僅僅關(guān)注當(dāng)這個(gè)指針要被釋放的時(shí)候,誰將負(fù)責(zé)去做。
使用資源句柄,這里用了標(biāo)準(zhǔn)庫中的auto_ptr,使需要為之負(fù)責(zé)的地方變得明確了。在更一般的意義上考慮資源,而不僅僅是內(nèi)存。如果在你的環(huán)境中不能系統(tǒng)地應(yīng)用這些技巧(例如,你必須使用別的地方的代碼。
或者你的程序的另一部分簡直是原始人類(譯注:原文是Neanderthals,尼安德特人,舊石器時(shí)代廣泛分布在歐洲的猿人)寫的,如此等等),那么注意使用一個(gè)內(nèi)存泄漏檢測器作為開發(fā)過程的一部分,或者插入一個(gè)垃圾收集器(garbage collector)。
我為什么在捕獲一個(gè)異常之后就不能繼續(xù)?換句話說,C++為什么不提供一種簡單的方式,讓程序能夠回到異常拋出點(diǎn)之后,并繼續(xù)執(zhí)行?主要的原因是,如果從異常處理之后繼續(xù),那么無法預(yù)知擲出點(diǎn)之后的代碼如何對待異常處理,是否僅僅繼續(xù)執(zhí)行,就象什么也沒有發(fā)生一樣。
異常處理者無法知道,在繼續(xù)之前,有關(guān)的上下文環(huán)境(context)是否是“正確”的。要讓這樣的代碼正確執(zhí)行,拋出異常的編寫者與捕獲異常的編寫者必須對彼此的代碼與上下文環(huán)境都非常熟悉才行。這樣會產(chǎn)生非常復(fù)雜的依賴性,因此無論在什么情況下,都會導(dǎo)致一系列嚴(yán)重的維護(hù)問題。
當(dāng)我設(shè)計(jì)C++的異常處理機(jī)制時(shí),我曾經(jīng)認(rèn)真地考慮過C++風(fēng)格與技巧允許這種繼續(xù)的可能性,而且在標(biāo)準(zhǔn)化的過程中,這個(gè)問題被非常詳細(xì)地討論過。請參見《C++語言的設(shè)計(jì)和演變》中的異常處理章節(jié)。
【編輯推薦】