青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Robin Chow's C++ Blog

 

[導(dǎo)入]Exception C++ 之 18

C++ 中 bool 是一個(gè)基本類型,可以通過(guò)各種方法來(lái)模擬它,但是都存在不同的缺陷:
  1. 使用 typedef 模擬,bool 不允許重載。
  2. 使用 #define,bool 不允許重載且通常破壞了 #define。
  3. enum bool允許重載但在條件表達(dá)式中不能進(jìn)行自動(dòng)類型轉(zhuǎn)換。bool b = (i == j)是錯(cuò)誤的,因?yàn)?int 不能隱含地轉(zhuǎn)換成 enums。
  4. bool 類允許重載但不能讓 bool 對(duì)象在條件中作測(cè)試,除非它能提供自動(dòng)轉(zhuǎn)換到基本類型,但是提供自動(dòng)轉(zhuǎn)換卻通常會(huì)干擾函數(shù)重載解析過(guò)程。

文章來(lái)源:http://my.donews.com/robinchow/2007/01/15/bszvusphgepqbphvticopjkpfadfapccibyd/

posted @ 2007-10-23 20:51 Robin Chow 閱讀(96) | 評(píng)論 (0)編輯 收藏

[導(dǎo)入]編寫(xiě)異常安全的代碼

對(duì)于異常安全的評(píng)定,可分為三個(gè)級(jí)別:基本保證、強(qiáng)保證和不會(huì)失敗。

  基本保證:確保出現(xiàn)異常時(shí)程序(對(duì)象)處于未知但有效的狀態(tài)。所謂有效,即對(duì)象的不變式檢查全部通過(guò)。
  強(qiáng)保證:確保操作的事務(wù)性,要么成功,程序處于目標(biāo)狀態(tài),要么不發(fā)生改變。
  不會(huì)失?。簩?duì)于大多數(shù)函數(shù)來(lái)說(shuō),這是很難保證的。對(duì)于C++程序,至少析構(gòu)函數(shù)、釋放函數(shù)和swap函數(shù)要確保不會(huì)失敗,這是編寫(xiě)異常安全代碼的基礎(chǔ)。

總結(jié)一下編寫(xiě)異常安全代碼的幾條準(zhǔn)則:

  1.只在應(yīng)該使用異常的地方拋出異常
  2.如果不知道如何處理異常,請(qǐng)不要捕獲(截留)異常。
  3.充分使用RAII(smart ptr),旁路異常。
  4.努力實(shí)現(xiàn)強(qiáng)保證,至少實(shí)現(xiàn)基本保證。
  5.確保析構(gòu)函數(shù)、釋放類函數(shù)和swap不會(huì)失敗。

  另外,還有一些語(yǔ)言細(xì)節(jié)問(wèn)題:

  1.不要這樣拋出異常:throw new exception;這將導(dǎo)致內(nèi)存泄漏。
  2.自定義類型,應(yīng)該捕獲異常的引用類型:catch(exception& e)或catch(const exception& e)。
  3.不要使用異常規(guī)范,即使是空異常規(guī)范。編譯器并不保證只拋出異常規(guī)范允許的異常,更多內(nèi)容請(qǐng)參考相關(guān)書(shū)籍。


文章來(lái)源:http://my.donews.com/robinchow/2007/01/11/vdcfhpltuhbzmtzupiknflljcnxqpkyloaqv/

posted @ 2007-10-23 20:49 Robin Chow 閱讀(94) | 評(píng)論 (0)編輯 收藏

[導(dǎo)入]Exception C++ 之 7

關(guān)于強(qiáng)異常安全性:
  1. 要對(duì)強(qiáng)異常安全性提供保證,經(jīng)常需要以放棄一部分性能為代價(jià)。
  2. 如果一個(gè)函數(shù)含有多重的副作用,那么其總是無(wú)法稱為強(qiáng)異常安全的。此時(shí),惟一的方法就是將函數(shù)分為幾個(gè)函數(shù),以使得每一個(gè)分出來(lái)的函數(shù)之副作用能被自動(dòng)完成。
  3. 并不是所有函數(shù)都需要具有強(qiáng)異常安全性。

文章來(lái)源:http://my.donews.com/robinchow/2007/01/11/ulvagfkakeqfccpqydkwfkcfgfqopwvjiqkp/

posted @ 2007-10-23 20:49 Robin Chow 閱讀(74) | 評(píng)論 (0)編輯 收藏

[導(dǎo)入]Exception C++ 之 8

類的設(shè)計(jì)準(zhǔn)則:
  1. 盡量重復(fù)運(yùn)用代碼,特別是標(biāo)準(zhǔn)庫(kù)。這樣不但比較快,也比較容易,比較安全。
  2. 小心隱式轉(zhuǎn)換所帶來(lái)的隱式臨時(shí)對(duì)象。避免這東西的一個(gè)好辦法就是盡可能讓 constructors 稱為 explicit,并且避免寫(xiě)出轉(zhuǎn)換運(yùn)算子。
  3. 盡量以 by const&(而非 by value)的方式來(lái)傳遞物件。
  4. 盡量寫(xiě)“a op = b;”而不要寫(xiě)成“a = a op b;”(其中 op 代表任何運(yùn)算子)。這樣不但比較清楚,通常也比較有效率。
  5. 如果提供了某個(gè)運(yùn)算子的標(biāo)準(zhǔn)版(例如 operator+),同時(shí)也應(yīng)該為它提供一份 assignment 版(例如 operator+=)并且以后者為基礎(chǔ)來(lái)實(shí)現(xiàn)前者。同時(shí)總是保存 op 和 op= 之間的自然關(guān)系(其中 op 代表任何運(yùn)算子)。
  6. 使用一下準(zhǔn)則來(lái)決定一個(gè)運(yùn)算子應(yīng)該是 member function 或應(yīng)該是個(gè) nonmember function:
    • 一元運(yùn)算子應(yīng)該是 members。
    • = () [] 和 -> 必須是members。
    • assignment 版的運(yùn)算子(+= -= /= *= 等等)都必須是members。
    • 其他所有二元運(yùn)算子都應(yīng)該是 nonmembers。
  7. 總是在 operator<< 和 operator>> 函數(shù)中傳回 stream references。
  8. 為了一致性,應(yīng)該總是以前置式累加運(yùn)算符為本,實(shí)現(xiàn)出后置式累加運(yùn)算符。
  9. 不要在變量名前面加上下劃線,因?yàn)闃?biāo)準(zhǔn)規(guī)個(gè)書(shū)中保留了某些“下劃線”開(kāi)頭的識(shí)別符號(hào)給編譯器使用。

文章來(lái)源:http://my.donews.com/robinchow/2007/01/11/jabxiufnsuhdoddxaufbdnewyegsorjxrkua/

posted @ 2007-10-23 20:49 Robin Chow 閱讀(82) | 評(píng)論 (0)編輯 收藏

[導(dǎo)入]More Effective C++讀書(shū)筆記

條款1:指針與引用的區(qū)別
二者之間的區(qū)別是:在任何情況下都不能用指向空值的引用,而指針則可以;指針可以被重新賦值以指向另一個(gè)不同的對(duì)象,但是引用則總是指向在初始化時(shí)被指定的對(duì)象,以后不能改變。
在以下情況下使用指針:一是存在不指向任何對(duì)象的可能性;二是需要能夠在不同的時(shí)刻指向不同的對(duì)象。
在以下情況使用引用:總是指向一個(gè)對(duì)象且一旦指向一個(gè)對(duì)象之后就不會(huì)改變指向;重載某個(gè)操作符時(shí),使用指針會(huì)造成語(yǔ)義誤解。

條款2:盡量使用C++風(fēng)格的類型轉(zhuǎn)換
static_cast:功能上基本上與C風(fēng)格的類型轉(zhuǎn)換一樣強(qiáng)大,含義也一樣。但是不能把struct轉(zhuǎn)換成int類型或者把double類型轉(zhuǎn)換成指針類型。另外,它不能從表達(dá)式中去除const屬性。
const_cast:用于類型轉(zhuǎn)換掉表達(dá)式的const或volatileness屬性。但是不能用它來(lái)完成修改這兩個(gè)屬性之外的事情。
dynamic_cast:用于安全地沿著類的繼承關(guān)系向下類型轉(zhuǎn)換。失敗的轉(zhuǎn)換將返回空指針或者拋出異常。
reinterpret_cast:這個(gè)操作符被用于的類型轉(zhuǎn)換的轉(zhuǎn)換結(jié)果時(shí)實(shí)現(xiàn)時(shí)定義。因此,使用它的代碼很難移植。最普通的用途就是在函數(shù)指針之間進(jìn)行轉(zhuǎn)換。

條款3:不要使用多態(tài)性數(shù)組
多態(tài)和指針?biāo)惴ú荒芑旌显谝黄鹗褂?,所以?shù)組和多態(tài)也不能用在一起。
數(shù)組中各元素的內(nèi)存地址是數(shù)組的起始地址加上之前各個(gè)元素的大小得到的,如果各元素大小不一,那么編譯器將不能正確地定位元素,從而產(chǎn)生錯(cuò)誤。

條款4:避免無(wú)用的缺省構(gòu)造函數(shù)
沒(méi)有缺省構(gòu)造函數(shù)造成的問(wèn)題:通常不可能建立對(duì)象數(shù)組,對(duì)于使用非堆數(shù)組,可以在定義時(shí)提供必要的參數(shù)。另一種方法是使用指針數(shù)組,但是必須刪除數(shù)組里的每個(gè)指針指向的對(duì)象,而且還增加了內(nèi)存分配量。
提供無(wú)意義的缺省構(gòu)造函數(shù)會(huì)影響類的工作效率,成員函數(shù)必須測(cè)試所有的部分是否都被正確的初始化。

條款5:謹(jǐn)慎定義類型轉(zhuǎn)換函數(shù)
缺省的隱式轉(zhuǎn)換將帶來(lái)出乎意料的結(jié)果,因此應(yīng)該盡量消除,使用顯式轉(zhuǎn)換函數(shù)。通過(guò)不聲明運(yùn)算符的方法,可以克服隱式類型轉(zhuǎn)換運(yùn)算符的缺點(diǎn),通過(guò)使用explicit關(guān)鍵字和代理類的方法可以消除單參數(shù)構(gòu)造函數(shù)造成的隱式轉(zhuǎn)換。

條款6:自增和自減操作符前綴形式與后綴形式的區(qū)別
后綴式有一個(gè)int類型參數(shù),當(dāng)函數(shù)被調(diào)用時(shí),編譯器傳遞一個(gè)0作為int參數(shù)的值傳遞給該函數(shù)。可以在定義時(shí)省略掉不想使用的參數(shù)名稱,以避免警告信息。
后綴式返回const對(duì)象,原因是 :使該類的行為和int一致,而int不允許連續(xù)兩次自增后綴運(yùn)算;連續(xù)兩次運(yùn)算實(shí)際只增一次,和直覺(jué)不符。
前綴比后綴效率更高,因?yàn)楹缶Y要返回對(duì)象,而前綴只返回引用。另外,可以用前綴來(lái)實(shí)現(xiàn)后綴,以方便維護(hù)。

條款7:不要重載&&,||,或者“,”
對(duì) 于以上操作符來(lái)說(shuō),計(jì)算的順序是從左到右,返回最右邊表達(dá)式的值。如果重載的話,不能保證其計(jì)算順序和基本類型想同。操作符重載的目的是使程序更容易閱 讀,書(shū)寫(xiě)和理解,而不是來(lái)迷惑其他人。如果沒(méi)有一個(gè)好理由重載操作符,就不要重載。而對(duì)于&&,||和“,”,很難找到一個(gè)好理由。

條款8:理解各種不同含義的new和delete
new操作符完成的功能分兩部分:第一部分是分配足夠的內(nèi)存以便容納所需類型的對(duì)象;第二部分是它調(diào)用構(gòu)造函數(shù)初始化內(nèi)存中的對(duì)象。new操作符總是做這兩件事,我們不能以任何方式改變它的行為。
我們能改變的是如何為對(duì)象分配內(nèi)存。new操作符通過(guò)調(diào)用operator new來(lái)完成必需的內(nèi)存分配,可以重寫(xiě)或重載這個(gè)函數(shù)來(lái)改變它的行為??梢燥@式調(diào)用operator來(lái)分配原始內(nèi)存。
如果已經(jīng)分配了內(nèi)存,需要以此內(nèi)存來(lái)構(gòu)造對(duì)象,可以使用placement new,其調(diào)用形式為new(void* buffer)class(int size)。
對(duì)于delete來(lái)說(shuō),應(yīng)該和new保持一致,怎樣分配內(nèi)存,就應(yīng)該采用相應(yīng)的辦法釋放內(nèi)存。
operator new[]與operator delete[]和new與delete相類似。

條款9:使用析構(gòu)函數(shù)防止資源泄漏
使用指針時(shí),如果在delete指針之前產(chǎn)生異常,將會(huì)導(dǎo)致不能刪除指針,從而產(chǎn)生資源泄漏。
解決辦法:使用對(duì)象封裝資源,如使用auto_ptr,使得資源能夠自動(dòng)被釋放。

條款10:在構(gòu)造函數(shù)中防止資源泄漏
類中存在指針時(shí),在構(gòu)造函數(shù)中需要考慮出現(xiàn)異常的情況:異常將導(dǎo)致以前初始化的其它指針成員不能刪除,從而產(chǎn)生資源泄漏。解決辦法是在構(gòu)造函數(shù)中考慮異常處理,產(chǎn)生異常時(shí)釋放已分配的資源。最好的方法是使用對(duì)象封裝資源。

條款11:禁止異常信息傳遞到析構(gòu)函數(shù)外
禁止異常傳遞到析構(gòu)函數(shù)外的兩個(gè)原因:第一能夠在異常傳遞的堆棧輾轉(zhuǎn)開(kāi)解的過(guò)程中,防止terminate被調(diào)用;第二它能幫助確保析構(gòu)函數(shù)總能完成我們希望它做的所有事情。
解決方法是在析構(gòu)函數(shù)中使用try-catch塊屏蔽所有異常。

條款12:理解“拋出一個(gè)異?!迸c“傳遞一個(gè)參數(shù)”或“調(diào)用一個(gè)虛函數(shù)”間的差異
有 三個(gè)主要區(qū)別:第一,異常對(duì)象在傳遞時(shí)總被進(jìn)行拷貝。當(dāng)通過(guò)傳值方式捕獲時(shí),異常對(duì)象被拷貝了兩次。對(duì)象作為參數(shù)傳遞給函數(shù)時(shí)不需要被拷貝;第二,對(duì)象作 為異常被拋出與作為參數(shù)傳遞給函數(shù)相比,前者類型轉(zhuǎn)換比后者少(前者只有兩種轉(zhuǎn)換形式:繼承類與基類的轉(zhuǎn)換,類型化指針到無(wú)類型指針的轉(zhuǎn)換);最后一點(diǎn), catch子句進(jìn)行異常類型匹配的順序是它們?cè)谠创a中出現(xiàn)的順序,第一個(gè)類型匹配成功的擦他處將被用來(lái)執(zhí)行。當(dāng)一個(gè)對(duì)象調(diào)用一個(gè)虛函數(shù)時(shí),被選擇的函數(shù) 位于與對(duì)象類型匹配最佳的類里,急事該類不是在源代碼的最前頭。

條款13:通過(guò)引用捕獲異常
有三個(gè)選擇可以捕獲異常:第一、指 針,建立在堆中的對(duì)象必需刪除,而對(duì)于不是建立在堆中的對(duì)象,刪除它會(huì)造成不可預(yù)測(cè)的后果,因此將面臨一個(gè)難題:對(duì)象建立在堆中還是不在堆中;第二、傳 值,異常對(duì)象被拋出時(shí)系統(tǒng)將對(duì)異常對(duì)象拷貝兩次,而且它會(huì)產(chǎn)生“對(duì)象切割”,即派生類的異常對(duì)象被作為基類異常對(duì)象捕獲時(shí),它的派生類行為就被切割調(diào)了。 這樣產(chǎn)生的對(duì)象實(shí)際上是基類對(duì)象;第三、引用,完美解決以上問(wèn)題。

條款14:審慎使用異常規(guī)格
避免調(diào)用unexpected函數(shù) 的辦法:第一、避免在帶有類型參數(shù)的模板內(nèi)使用異常規(guī)格。因?yàn)槲覀儧](méi)有辦法知道某種模板類型參數(shù)拋出什么樣的異常,所以不可能為一個(gè)模板提供一個(gè)有意義的 異常規(guī)格;第二、如果在一個(gè)函數(shù)內(nèi)調(diào)用其它沒(méi)有異常規(guī)格的函數(shù)時(shí)應(yīng)該去除這個(gè)函數(shù)的異常規(guī)格;第三、處理系統(tǒng)本身拋出的異常??梢詫⑺械?unexpected異常都被替換為自定義的異常對(duì)象,或者替換unexpected函數(shù),使其重新拋出當(dāng)前異常,這樣異常將被替換為 bad_exception,從而代替原來(lái)的異常繼續(xù)傳遞。
很容易寫(xiě)出違反異常規(guī)格的代碼,所以應(yīng)該審慎使用異常規(guī)格。

條款15:了解異常處理的系統(tǒng)開(kāi)銷
三 個(gè)方面:第一、需要空間建立數(shù)據(jù)結(jié)構(gòu)來(lái)跟蹤對(duì)象是否被完全構(gòu)造,還需要系統(tǒng)時(shí)間保持這些數(shù)據(jù)結(jié)構(gòu)不斷更新;第二、try塊。無(wú)論何時(shí)使用它,都得為此付出 代價(jià)。編譯器為異常規(guī)格生成的代碼與它們?yōu)閠ry塊生成的代碼一樣多,所以一個(gè)異常規(guī)格一般花掉與try塊一樣多的系統(tǒng)開(kāi)銷。第三、拋出異常的開(kāi)銷。因?yàn)?異常很少見(jiàn),所以這樣的事件不會(huì)對(duì)整個(gè)程序的性能造成太大的影響。

條款16:牢記80─20準(zhǔn)則
80─20準(zhǔn)則說(shuō)的是大約20%的代碼使用了80%的程序資源,即軟件整體的性能取決于代碼組成中的一小部分。使用profiler來(lái)確定程序中的那20%,關(guān)注那些局部效率能夠被極大提高的地方。

條款17:考慮使用懶惰計(jì)算法
懶惰計(jì)算法的含義是拖延計(jì)算的時(shí)間,等到需要時(shí)才進(jìn)行計(jì)算。其作用為:能避免不需要的對(duì)象拷貝,通過(guò)使用operator[]區(qū)分出讀寫(xiě)操作,避免不需要的數(shù)據(jù)庫(kù)讀取操作,避免不需要的數(shù)字操作。但是,如果計(jì)算都是重要的,懶惰計(jì)算法可能會(huì)減慢速度并增加內(nèi)存的使用。

條款18:分期攤還期望的計(jì)算
核心是使用過(guò)度熱情算法,有兩種方法:緩存那些已經(jīng)被計(jì)算出來(lái)而以后還有可能需要的值;預(yù)提取,做比當(dāng)前需要做的更多事情。
當(dāng)必須支持某些操作而不總需要其結(jié)果時(shí),可以使用懶惰計(jì)算法提高程序運(yùn)行效率;當(dāng)必須支持某些操作而其結(jié)果幾乎總是被需要或不止一次地需要時(shí),可以使用過(guò)度熱情算法提高程序運(yùn)行效率。

條款19:理解臨時(shí)對(duì)象的來(lái)源
臨時(shí)對(duì)象產(chǎn)生的兩種條件:為了是函數(shù)成功調(diào)用而進(jìn)行隱式類型轉(zhuǎn)換和函數(shù)返回對(duì)象時(shí)。
臨時(shí)對(duì)象是有開(kāi)銷的,因此要盡可能去消除它們,然而更重要的是訓(xùn)練自己尋找可能建立臨時(shí)對(duì)象的地方。在任何時(shí)候只要見(jiàn)到常量引用參數(shù),就存在建立臨時(shí)對(duì)象而綁定在參數(shù)上的可能性。在任何時(shí)候只要見(jiàn)到函數(shù)返回對(duì)象,就會(huì)有一個(gè)臨時(shí)對(duì)象被建立(以后被釋放)。

條款20:協(xié)助完成返回值優(yōu)化
應(yīng)當(dāng)返回一個(gè)對(duì)象時(shí)不要試圖返回一個(gè)指針或引用。
C+ +規(guī)則允許編譯器優(yōu)化不出現(xiàn)的臨時(shí)對(duì)象,所有最佳的辦法莫過(guò)于:retrun Ratinal(lhs.numerator()*rhs.numerator(), lhs.denominator()*rhs.denominator())。這種優(yōu)化是通過(guò)使用函數(shù)的retuan location(或者用在一個(gè)函數(shù)調(diào)用位置的對(duì)象來(lái)替代),來(lái)消除局部臨時(shí)對(duì)象,這種優(yōu)化還有一個(gè)名字:返回值優(yōu)化。

條款21:通過(guò)重載避免隱式類型轉(zhuǎn)換
隱式類型轉(zhuǎn)換將產(chǎn)生臨時(shí)對(duì)象,從而帶來(lái)額外的系統(tǒng)開(kāi)銷。
解決辦法是使用重載,以避免隱式類型轉(zhuǎn)換。要注意的一點(diǎn)是在C++中有一條規(guī)則是每一個(gè)重載的operator必須帶有一個(gè)用戶定義類型的參數(shù)(這條規(guī)定是有道理的,如果沒(méi)有的話,程序員將能改變預(yù)定義的操作,這樣做肯定吧程序引入混亂的境地)。
另外,牢記80─20規(guī)則,沒(méi)有必要實(shí)現(xiàn)大量的重載函數(shù),除非有理由確信程序使用重載函數(shù)后整體效率會(huì)有顯著提高。

條款22:考慮用運(yùn)算符的賦值形式取代其單獨(dú)形式
運(yùn)算符的賦值形式不需要產(chǎn)生臨時(shí)對(duì)象,因此應(yīng)該盡量使用。對(duì)運(yùn)算符的單獨(dú)形式的最佳實(shí)現(xiàn)方法是return Rational(lhs) += rhs;這種方法將返回值優(yōu)化和運(yùn)算符的賦值形式結(jié)合起來(lái),即高效,又方便。

條款23:考慮變更程序庫(kù)
程序庫(kù)必須在效率和功能等各個(gè)方面有各自的權(quán)衡,因此在具體實(shí)現(xiàn)時(shí)應(yīng)該考慮利用程序庫(kù)的優(yōu)點(diǎn)。例如程序存在I/O瓶頸,就可以考慮用stdio替代iostream。

條款24:理解虛擬函數(shù)、多繼承、虛基類和RTTI所需的代價(jià)
虛函數(shù)所需的代價(jià):必須為每個(gè)包含虛函數(shù)的類的virtual table留出空間;每個(gè)包含虛函數(shù)的類的對(duì)象里,必須為額外的指針付出代價(jià);實(shí)際上放棄了使用內(nèi)聯(lián)函數(shù)。
多繼承時(shí),在單個(gè)對(duì)象里有多個(gè)vptr(一個(gè)基類對(duì)應(yīng)一個(gè))。它和虛基類一樣,會(huì)增加對(duì)象體積的大小。
RTTI能讓我們?cè)谶\(yùn)行時(shí)找到對(duì)象和類的有關(guān)信息,所以肯定有某個(gè)地方存儲(chǔ)了這些信息,讓我們查詢。這些信息被存儲(chǔ)在類型為type_info的對(duì)象里,可以通過(guò)typeid操作符訪問(wèn)到一個(gè)類的typeid對(duì)象。通常,RTTI被設(shè)計(jì)為在類的vbtl上實(shí)現(xiàn)。

條款25:將構(gòu)造函數(shù)和非成員函數(shù)虛擬化
構(gòu) 造函數(shù)的虛擬化看似無(wú)意義,但是在實(shí)際當(dāng)中有一定的用處。例如,在類中構(gòu)建一個(gè)虛擬函數(shù),其功能僅僅是實(shí)現(xiàn)構(gòu)造函數(shù),就可以對(duì)外界提供一組派生類的公共構(gòu) 造接口。虛擬拷貝構(gòu)造函數(shù)也是可以實(shí)現(xiàn)的,但是要利用到最近才被采納的較寬松的虛擬函數(shù)返回值類型規(guī)則。被派生類重定義的虛擬函數(shù)不用必須與基類的虛擬函 數(shù)具有一樣的返回類型。
具有虛擬行為的非成員函數(shù)很簡(jiǎn)單。首先編寫(xiě)一個(gè)虛擬函數(shù)完成工作,然后再寫(xiě)衣一個(gè)非虛擬函數(shù),它什么也不做只是調(diào)用這個(gè)函數(shù),可以使用內(nèi)聯(lián)來(lái)避免函數(shù)調(diào)用的開(kāi)銷。

條款26:限制某個(gè)類所能產(chǎn)生的對(duì)象數(shù)量
只 有一個(gè)對(duì)象:使用單一模式,將類的構(gòu)造函數(shù)聲明為private,再聲明一個(gè)靜態(tài)函數(shù),該函數(shù)中有一個(gè)類的靜態(tài)對(duì)象。不將該靜態(tài)對(duì)象放在類中原因是放在函 數(shù)中時(shí),執(zhí)行函數(shù)時(shí)才建立對(duì)象,并且對(duì)象初始化時(shí)間確定的,即第一次執(zhí)行該函數(shù)時(shí)。另外,該函數(shù)不能聲明為內(nèi)聯(lián),如果內(nèi)聯(lián)可能造成程序的靜態(tài)對(duì)象拷貝超過(guò) 一個(gè)。
限制對(duì)象個(gè)數(shù):建立一個(gè)基類,構(gòu)造函數(shù)中計(jì)數(shù)加一,若超過(guò)最大值則拋出異常;析構(gòu)函數(shù)中計(jì)數(shù)減一。
編程點(diǎn)滴:
●將模板類的定義和實(shí)現(xiàn)放在一個(gè)文件中,否則將造成引用未定義錯(cuò)誤(血的教訓(xùn));
●靜態(tài)數(shù)據(jù)成員需要先聲明再初始化;
●用常量值作初始化的有序類型的const靜態(tài)數(shù)據(jù)成員是一個(gè)常量表達(dá)式(可以作為數(shù)組定義的維數(shù));
●構(gòu)造函數(shù)中拋出異常,將導(dǎo)致靜態(tài)數(shù)組成員重新初始化。

條款27:要求或禁止在堆中產(chǎn)生對(duì)象
在堆中的對(duì)象不一定是用new分配的對(duì)象,例如成員對(duì)象,雖然不是用new分配的但是仍然在堆中。
要 求在堆中建立對(duì)象可以將析構(gòu)函數(shù)聲明未private,再建立一個(gè)虛擬析構(gòu)函數(shù)進(jìn)行對(duì)象析構(gòu)。此時(shí)如果建立非堆對(duì)象將導(dǎo)致析構(gòu)函數(shù)不能通過(guò)編譯。當(dāng)然也可 以將構(gòu)造函數(shù)聲明為private,但是這樣將導(dǎo)致必須聲明n個(gè)構(gòu)造函數(shù)(缺省,拷貝等等)。為了解決繼承問(wèn)題,可以將其聲明為protected,解決 包容問(wèn)題則只能將其聲明為指針。
沒(méi)有辦法不能判斷一個(gè)對(duì)象是否在堆中,但是可以判斷一個(gè)對(duì)象是否可以安全用delete刪除,只需在operator new中將其指針加入一個(gè)列表,然后根據(jù)此列表進(jìn)行判斷。
把一個(gè)指針dynamic_cast成void*類型(或const void*或volatile void*等),生成的指針將指向“原指針指向?qū)ο髢?nèi)存”的開(kāi)始處。但是dynamic_cast只能用于“指向至少具有一個(gè)虛擬函數(shù)的對(duì)象”的指針上。
禁止建立堆對(duì)象可以簡(jiǎn)單的將operator new聲明為private,但是仍然不能判斷其是否在堆中。

條款28:靈巧(smart)指針
靈巧指針的用處是可以對(duì)操作進(jìn)行封裝,同一用戶接口。
靈巧指針從模板生成,因?yàn)橐c內(nèi)建指針類似,必須是強(qiáng)類型的;模板參數(shù)確定指向?qū)ο蟮念愋汀?br /> 靈巧指針的拷貝和賦值,采取的方案是“當(dāng)auto_ptr被拷貝和賦值時(shí),對(duì)象所有權(quán)隨之被傳遞”。此時(shí),通過(guò)傳值方式傳遞靈巧指針對(duì)象將導(dǎo)致不確定的后果,應(yīng)該使用引用。
記住當(dāng)返回類型是基類而返回對(duì)象實(shí)際上派生類對(duì)象時(shí),不能傳遞對(duì)象,應(yīng)該傳遞引用或指針,否則將產(chǎn)生對(duì)象切割。
測(cè)試靈巧指針是否為NULL有兩種方案:一種是使用類型轉(zhuǎn)換,將其轉(zhuǎn)換為void*,但是這樣將導(dǎo)致類型不安全,因?yàn)椴煌愋偷撵`巧指針之間將能夠互相比較;另一種是重載operator!,這種方案只能使用!ptr這種方式檢測(cè)。
最好不要提供轉(zhuǎn)換到內(nèi)建指針的隱式類型轉(zhuǎn)換操作符,直接提供內(nèi)建指針將破壞靈巧指針的“靈巧”特性。
靈巧指針的繼承類到基類的類型轉(zhuǎn)換的一個(gè)最佳解決方案是使用模板成員函數(shù),這將使得內(nèi)建指針?biāo)锌梢赞D(zhuǎn)換的類型也可以在靈巧指針中進(jìn)行轉(zhuǎn)換。但是對(duì)于間接繼承的情況,必須用dynamic_cast指定其要轉(zhuǎn)換的類型是直接基類還是間接基類。
為了實(shí)現(xiàn)const靈巧指針,可以新建一個(gè)類,該類從非const靈巧指針繼承。這樣的化,const靈巧指針能做的,非const靈巧指針也能做,從而與標(biāo)準(zhǔn)形式相同。

條款29:引用計(jì)數(shù)
使用引用計(jì)數(shù)后,對(duì)象自己擁有自己,當(dāng)沒(méi)有人再使用它時(shí),它自己自動(dòng)銷毀自己。因此,引用計(jì)數(shù)是個(gè)簡(jiǎn)單的垃圾回收體系。
在基類中調(diào)用delete this將導(dǎo)致派生類的對(duì)象被銷毀。
寫(xiě)時(shí)拷貝:與其它對(duì)象共享一個(gè)值直到寫(xiě)操作時(shí)才擁有自己的拷貝。它是Lazy原則的特例。
精彩的類層次結(jié)構(gòu):

RCObject類提供計(jì)數(shù)操作;StringValue包含指向數(shù)據(jù)的指針并繼承RCObject的計(jì)數(shù)操作;RCPtr是一個(gè)靈巧指針,封裝了本屬于String的一些計(jì)數(shù)操作。

條款30:代理類
可以用兩個(gè)類來(lái)實(shí)現(xiàn)二維數(shù)組:Array1D是一個(gè)一維數(shù)組,而Array2D則是一個(gè)Array1D的一維數(shù)組。Array1D的實(shí)例扮演的是一個(gè)在概念上不存在的一維數(shù)組,它是一個(gè)代理類。
代 理類最神奇的功能是區(qū)分通過(guò)operator[]進(jìn)行的是讀操作還是寫(xiě)操作,它的思想是對(duì)于operator[]操作,返回的不是真正的對(duì)象,而是一個(gè) proxy類,這個(gè)代理類記錄了對(duì)象的信息,將它作為賦值操作的目標(biāo)時(shí),proxy類扮演的是左值,用其它方式使用它,proxy類扮演的是右值。用賦值 操作符來(lái)實(shí)現(xiàn)左值操作,用隱式類型轉(zhuǎn)換來(lái)實(shí)現(xiàn)右值操作。
用proxy類區(qū)分operator[]作左值還是右值的局限性:要實(shí)現(xiàn)proxy類和原類型的無(wú)縫替代,必須申明原類型的一整套操作符;另外,使用proxy類還有隱式類型轉(zhuǎn)換的所有缺點(diǎn)。
編程點(diǎn)滴:不能將臨時(shí)對(duì)象綁定為非const的引用的行參。

條款31:讓函數(shù)根據(jù)一個(gè)以上的對(duì)象來(lái)決定怎么虛擬
有 三種方式:用虛函數(shù)加RTTI,在派生類的重載虛函數(shù)中使用if-else對(duì)傳進(jìn)的不同類型參數(shù)執(zhí)行不同的操作,這樣做幾乎放棄了封裝,每增加一個(gè)新的類 型時(shí),必須更新每一個(gè)基于RTTI的if-else鏈以處理這個(gè)新的類型,因此程序本質(zhì)上是沒(méi)有可維護(hù)性的;只使用虛函數(shù),通過(guò)幾次單獨(dú)的虛函數(shù)調(diào)用,第 一次決定第一個(gè)對(duì)象的動(dòng)態(tài)類型,第二次決定第二個(gè)對(duì)象動(dòng)態(tài)類型,如此這般。然而,這種方法的缺陷仍然是:每個(gè)類必須知道它的所有同胞類,增加新類時(shí),所有 代碼必須更新;模擬虛函數(shù)表,在類外建立一張模擬虛函數(shù)表,該表是類型和函數(shù)指針的映射,加入新類型是不須改動(dòng)其它類代碼,只需在類外增加一個(gè)處理函數(shù)即 可。

條款32:在未來(lái)時(shí)態(tài)開(kāi)發(fā)程序
未來(lái)時(shí)態(tài)的考慮只是簡(jiǎn)單地增加了一些額外約束:
●提供完備的類,即使某些部分現(xiàn)在還沒(méi)有被使用。
●將接口設(shè)計(jì)得便于常見(jiàn)操作并防止常見(jiàn)錯(cuò)誤。使得類容易正確使用而不易用錯(cuò)。
●如果沒(méi)有限制不能通用化代碼,那么通用化它。

條款33:將非尾端類設(shè)計(jì)為抽象類
如果有一個(gè)實(shí)體類公有繼承自另一個(gè)實(shí)體類,應(yīng)該將兩個(gè)類的繼承層次改為三個(gè)類的繼承層次,通過(guò)創(chuàng)造一個(gè)新的抽象類并將其它兩個(gè)實(shí)體類都從它繼承。因此,設(shè)計(jì)類層次的一般規(guī)則是:非尾端類應(yīng)該是抽象類。在處理外來(lái)的類庫(kù),可能不得不違反這個(gè)規(guī)則。
編程點(diǎn)滴:抽象類的派生類不能是抽象類;實(shí)現(xiàn)純虛函數(shù)一般不常見(jiàn),但對(duì)純虛析構(gòu)函數(shù),它必須實(shí)現(xiàn)。

條款34:如何在同一程序中混合使用C++和C
混合編程的指導(dǎo)原則:
●確保C++和C編譯器產(chǎn)生兼容的obj文件。
●將在兩種語(yǔ)言下都使用的函數(shù)申明為extern ‘C’。
●只要可能,用C++寫(xiě)main()。
●總用delete釋放new分配的內(nèi)存;總用free釋放malloc分配的內(nèi)存。
●將在兩種語(yǔ)言間傳遞的東西限制在用C編譯的數(shù)據(jù)結(jié)構(gòu)的范圍內(nèi);這些結(jié)構(gòu)的C++版本可以包含非虛成員函數(shù)。

條款35:讓自己習(xí)慣使用標(biāo)準(zhǔn)C++語(yǔ)言
STL 基于三個(gè)基本概念:包容器(container)、選擇子(iterator)和算法(algorithms)。包容器是被包容的對(duì)象的封裝;選擇子是類 指針的對(duì)象,讓你能如同使用指針操作內(nèi)建類型的數(shù)組一樣操作STL的包容器;算法是對(duì)包容器進(jìn)行處理的函數(shù),并使用選擇子來(lái)實(shí)現(xiàn)。
文章來(lái)源:http://my.donews.com/robinchow/2007/01/11/qimyhmnmnudhngtapaqrnsghpptjuutkcfjj/

posted @ 2007-10-23 20:49 Robin Chow 閱讀(109) | 評(píng)論 (0)編輯 收藏

[導(dǎo)入]虛擬函數(shù)和重載

如下面的程序:
#include < iostream > using namespace std;class base{ public: virtual void f(char i){ cout << "Base class: " << i << endl; }; virtual void f(double d){ cout << "Base class: " << d << endl; } }; class derived : public base{ public: void f(char i){ cout << "Derived class: " << i << endl; } }; int main(int argc, char** argv) { base *pb = new derived; pb->f(2.0); delete pb; return 0; }
開(kāi)始的時(shí)候感覺(jué)有點(diǎn)迷惑,被調(diào)用的是 base 的 f 呢?還是 derived 的 f(需要進(jìn)行參數(shù)類型轉(zhuǎn)換)。實(shí)驗(yàn)證明,被調(diào)用的是 base 的 f。 因?yàn)橹剌d是根據(jù)靜態(tài)類型來(lái)選擇函數(shù)的,亦即由 pb 本身的類型來(lái)決定。而虛擬則是根據(jù)動(dòng)態(tài)類型來(lái)選擇函數(shù),由 pb 指向的對(duì)象類型決定。因此編譯器首先根據(jù)重載來(lái)選擇一個(gè)基類的函數(shù),如果該函數(shù)為虛擬函數(shù)且被派生類實(shí)現(xiàn),則再通過(guò)多態(tài)機(jī)制調(diào)用派生類函數(shù)。
文章來(lái)源:http://my.donews.com/robinchow/2007/01/11/ocipmucddsvoutkpnwjgeqrlwadgilgxnoma/

posted @ 2007-10-23 20:49 Robin Chow 閱讀(80) | 評(píng)論 (0)編輯 收藏

[導(dǎo)入]Exception C++ 之 9

虛擬函數(shù)的設(shè)計(jì)準(zhǔn)則:
  1. 讓 base class 的析構(gòu)函數(shù)成為 virtual(除非確定不會(huì)有人企圖透過(guò) pointer-to-base 去刪除一個(gè) derived object)。
  2. 如果要提供一個(gè)函數(shù),其名稱與繼承而來(lái)的函數(shù)同名時(shí),如果不想因此隱藏了繼承而來(lái)的函數(shù),可使用 using declaration 來(lái)顯式聲明。
  3. 絕不要在改寫(xiě)虛擬函數(shù)的過(guò)程中改變預(yù)設(shè)參數(shù)。

文章來(lái)源:http://my.donews.com/robinchow/2007/01/11/eqhivxoubayqpkaluyekyuwxtdssqhxvxfes/

posted @ 2007-10-23 20:49 Robin Chow 閱讀(76) | 評(píng)論 (0)編輯 收藏

[導(dǎo)入]Exception C++ 之 10

在進(jìn)行類層次設(shè)計(jì)時(shí),常見(jiàn)的錯(cuò)誤是誤用公有繼承。除非要表達(dá)的是真正的 IS-A 和 WORKS-LIKE-A 的關(guān)系,才使用公有繼承。
設(shè)計(jì)準(zhǔn)則:
  1. 絕對(duì)不要以公有繼承來(lái)復(fù)用基類的代碼;公有繼承是為了被復(fù)用 - 被那些“以多態(tài)方式運(yùn)用基類對(duì)象”的代碼復(fù)用。
  2. 當(dāng)我們需要表達(dá)“用來(lái)實(shí)現(xiàn)”的關(guān)系時(shí),選擇成員方式而不要使用繼承。只有在絕對(duì)必要的情況下才使用私有繼承 - 也就是說(shuō)當(dāng)需要存取保護(hù)成員或是需要改寫(xiě)虛擬函數(shù)時(shí)。絕對(duì)不要只為了重復(fù)運(yùn)用代碼而使用公有繼承。


文章來(lái)源:http://my.donews.com/robinchow/2007/01/13/qzpjchcewcpuedbnfmewwwychrghoqnfpdor/

posted @ 2007-10-23 20:49 Robin Chow 閱讀(86) | 評(píng)論 (0)編輯 收藏

[導(dǎo)入]Exception C++ 之 11

編碼標(biāo)準(zhǔn):
  1. 封裝和隔離。
  2. 在聲明一個(gè)類的時(shí)候,應(yīng)避免暴露出其私有成員。
  3. 應(yīng)該使用一個(gè)形如“struct Xxxxlmpl *pimpl_”的不透明的指針來(lái)存儲(chǔ)私有成員(包括狀態(tài)變量和成員函數(shù))。
使用pimpl(編譯器防火墻)可以大大降低代碼之間的相互依賴性,對(duì)于pimpl_需要注意:
  1. pimpl_中存儲(chǔ)的是私有變量和私有成員函數(shù)。
  2. 一般需要一個(gè)反向指針(習(xí)慣稱為self_)來(lái)調(diào)用可見(jiàn)類的函數(shù)。
  3. 即使虛擬函數(shù)是私有的,也不能把虛擬成員函數(shù)隱藏在pimpl類中。

文章來(lái)源:http://my.donews.com/robinchow/2007/01/13/qwtfsgyamrxaxddpwhxeyatxgntnrlthhnna/

posted @ 2007-10-23 20:49 Robin Chow 閱讀(99) | 評(píng)論 (0)編輯 收藏

[導(dǎo)入]Exception C++ 之 12

Koenig Lookup:
如果你給函數(shù)提供一個(gè) class 類型的實(shí)參,那么在名稱搜索時(shí),編譯器將認(rèn)為包含實(shí)參類型的命名空間中的同名函數(shù)的可選函數(shù)。
接口原則:
對(duì)于一個(gè)類X,所有的函數(shù),包括自由函數(shù),只要同時(shí)滿足
  • “提到”X,并且
  • 與X“同期提供”
就是X的邏輯組成部分,因?yàn)樗鼈兘M成了X的接口。

接口原則與 Koenig lookup 的行為相同,因?yàn)?Koenig lookup 的行為正是建立在接口原則的基礎(chǔ)上的。
小結(jié):
  1. 接口原則:對(duì)于 class X,所有的函數(shù),包括自由函數(shù),只要同時(shí)滿足(a)“提及”X,(b)與 X“同期提供”,那么它就是X的邏輯組成部分,因?yàn)樗鼈兪?X 的接口的一部分。
  2. 因此,成員和非成員函數(shù)都是一個(gè) class 的邏輯組成部分。只不過(guò)成員函數(shù)比非成員函數(shù)有更強(qiáng)的關(guān)聯(lián)關(guān)系。
  3. 在接口原則中,對(duì)“同期提供”的最有用的解釋是“出現(xiàn)在相同的頭文件和/或命名空間中”。如果函數(shù)與 class 出現(xiàn)在相同的頭文件中,在依賴性分析時(shí),它是此 class 的組成部分。如果函數(shù)與類出現(xiàn)在相同的命名空間中,在對(duì)象引用和名稱搜索時(shí),它是此 class 的組成部分。



文章來(lái)源:http://my.donews.com/robinchow/2007/01/14/tlcchrdcrthuzvbqdhrczbijwughfpwzbybi/

posted @ 2007-10-23 20:49 Robin Chow 閱讀(82) | 評(píng)論 (0)編輯 收藏

僅列出標(biāo)題
共9頁(yè): 1 2 3 4 5 6 7 8 9 

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国内外成人免费激情在线视频网站 | 伊人成人网在线看| 亚洲激情综合| 国语自产精品视频在线看| 99热免费精品在线观看| 亚洲电影在线看| 欧美综合77777色婷婷| 亚洲欧美国产另类| 欧美日韩成人综合天天影院| 久久一区二区视频| 国产欧美一区二区三区国产幕精品 | 亚洲国产精品va在线看黑人动漫| 国产精品一区2区| 亚洲伦伦在线| 日韩亚洲视频| 欧美国产欧美综合| 亚洲黄色一区| 亚洲电影自拍| 久久久蜜桃一区二区人| 久久久久一区二区三区| 国产日韩av在线播放| 国产精品99久久久久久人| 亚洲卡通欧美制服中文| 欧美激情国产日韩| 亚洲国产高潮在线观看| 亚洲国产va精品久久久不卡综合| 久久久国产精品一区二区中文 | 欧美成人国产一区二区| 狠狠色丁香婷婷综合久久片| 欧美一区二区久久久| 久久精品国产清自在天天线 | 国内精品久久久久国产盗摄免费观看完整版 | 久久躁狠狠躁夜夜爽| 蜜臀久久99精品久久久画质超高清| 国产视频久久| 久久国产精品一区二区三区四区| 久久久久九九九| 曰本成人黄色| 欧美激情va永久在线播放| 欧美国产日韩一区二区三区| 亚洲伦理在线| 国产精品wwwwww| 亚洲欧美日本日韩| 久久伊人一区二区| 亚洲人永久免费| 国产精品xxxav免费视频| 午夜精品一区二区三区电影天堂| 老色鬼精品视频在线观看播放| 伊甸园精品99久久久久久| 欧美成人一区二免费视频软件| 亚洲三级免费| 欧美一区二区三区免费在线看 | 在线观看三级视频欧美| 免费精品视频| 一本色道久久加勒比精品| 欧美一级专区免费大片| 亚洲国产91色在线| 国产精品国产三级国产专播品爱网 | 亚洲欧洲一二三| 欧美在线一区二区三区| 亚洲福利专区| 国产精品久久久久久久app| 欧美在线观看www| 亚洲精品乱码久久久久久按摩观| 亚洲男人天堂2024| 亚洲国产精品一区二区三区| 欧美日韩在线免费| 久久―日本道色综合久久| 亚洲精品四区| 免费日韩一区二区| 亚洲欧美日韩综合国产aⅴ| 亚洲高清不卡在线观看| 国产精品免费在线| 欧美极品一区| 久久综合九色综合欧美狠狠| 一本色道婷婷久久欧美| 免费不卡在线观看| 欧美在线地址| 亚洲小视频在线观看| 在线观看的日韩av| 国产亚洲毛片在线| 国产精品久久久999| 欧美成人精品高清在线播放| 校园激情久久| 亚洲一区二区精品视频| 亚洲欧洲日韩女同| 欧美国产综合| 久久伊人免费视频| 久久精品九九| 亚洲欧美日韩精品综合在线观看| 亚洲精品乱码视频| 亚洲国产婷婷香蕉久久久久久| 国产精品入口尤物| 欧美日韩在线免费观看| 欧美国产精品中文字幕| 久久久一二三| 欧美中文字幕在线视频| 西西人体一区二区| 亚洲一区二区综合| 亚洲综合欧美日韩| 亚洲视频在线观看| 在线一区二区三区四区| 亚洲肉体裸体xxxx137| 亚洲国产一区视频| 亚洲国产色一区| 亚洲高清色综合| 亚洲电影网站| 亚洲日本成人在线观看| 91久久国产自产拍夜夜嗨| 亚洲国产精品黑人久久久| 亚洲国产精品一区二区三区| 欧美第十八页| 亚洲人成亚洲人成在线观看| 亚洲国产精品成人精品| 亚洲欧洲免费视频| 一区二区不卡在线视频 午夜欧美不卡在 | 乱中年女人伦av一区二区| 久久在线91| 亚洲第一网站免费视频| 亚洲国产电影| 艳妇臀荡乳欲伦亚洲一区| 亚洲网友自拍| 欧美一区二区三区在线视频| 欧美一区二区三区播放老司机| 久久久精品国产免大香伊| 开心色5月久久精品| 欧美电影免费观看高清| 欧美噜噜久久久xxx| 欧美三区视频| 国产亚洲成人一区| 亚洲国产精品久久精品怡红院| 亚洲精品极品| 亚洲欧美成人综合| 久热精品在线| 亚洲精选中文字幕| 亚洲欧美资源在线| 麻豆亚洲精品| 欧美视频专区一二在线观看| 国产目拍亚洲精品99久久精品| 国内精品福利| 亚洲最新视频在线播放| 午夜日韩激情| 亚洲国产精品成人久久综合一区| 正在播放欧美视频| 久久青青草综合| 国产精品成人一区二区艾草| 国产视频一区二区三区在线观看| 在线观看欧美黄色| 亚洲免费伊人电影在线观看av| 久久婷婷国产综合国色天香| 亚洲国产综合91精品麻豆| 亚洲自拍偷拍色片视频| 欧美成人官网二区| 国产乱码精品1区2区3区| 亚洲国产日韩欧美在线动漫| 一区二区三区国产精华| 久久夜色撩人精品| 亚洲午夜视频| 欧美福利影院| 一区二区亚洲精品国产| 亚洲午夜激情网站| 欧美国产视频日韩| 欧美在线一级视频| 国产精品va在线播放我和闺蜜| 亚洲第一天堂av| 久久国产免费| 一区二区三区www| 另类图片国产| 精品999久久久| 欧美在线欧美在线| 99天天综合性| 欧美精品v国产精品v日韩精品| 国产亚洲激情在线| 亚洲欧美清纯在线制服| 亚洲成色777777在线观看影院| 欧美一区二区网站| 国产欧美日韩中文字幕在线| 中文一区二区| 亚洲精品中文在线| 免费在线欧美视频| 亚洲第一精品福利| 久久亚洲综合色| 久久av免费一区| 国产一区二区三区四区三区四| 亚洲在线国产日韩欧美| 亚洲日韩中文字幕在线播放| 久久综合狠狠综合久久激情| 国产有码在线一区二区视频| 香蕉av777xxx色综合一区| 亚洲九九爱视频| 欧美大片专区| 日韩视频免费观看| 亚洲美女精品成人在线视频| 欧美www视频在线观看| 亚洲精品国产日韩| 亚洲人成人一区二区三区| 欧美激情亚洲综合一区| 在线视频中文亚洲| 亚洲最黄网站| 国产精一区二区三区|