您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++中final, finally, finalize的區(qū)別有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
C++11標(biāo)準(zhǔn)提供了說明符final。需要注意的是,C++11中的final不是關(guān)鍵字,而是說明符,這意味著您可以將它(在不引起混淆的情況下)將它作為標(biāo)識符使用(為了兼容以前的代碼)。關(guān)鍵字final有“這是無法改變的”或者“終態(tài)的”含義,它可以修飾非抽象類、非抽象類成員方法和變量。
C++11標(biāo)準(zhǔn)提供了說明符final,用于阻止派生類覆蓋特定的虛方法?;蚴亲柚挂粋€類成為基類。
語法1:class Someclass final {...};
語法2:class Someclass {...type somefun(arg-list) final;...};
class A { private: public: virtual void Test()const final {std::cout<<c<<std::endl;} //final修飾了put()函數(shù),使其不能被覆蓋 }; classB:publicA { private: public: //這里不能有void Test();了,因為有了final說明符 }; class A final//final修飾Z類,您不能從Z類派生出一個類,而只能用于創(chuàng)建對象 { private: public: void Test()const{std::cout<<d<<std::endl;} }; int main() //修飾變量,變量不可變 { char final ='X';//可以這么做 Xx(final); x.put();//輸出X Yy; y.put();//輸出B Zz(3.14159); z.put();//輸出3.14159 return0; }
finalize-方法名。Java技術(shù)允許使用finalize() 方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作。
這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調(diào)用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize()方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前被自動調(diào)用的。
垃圾收集器只知道釋放那些由new分配的內(nèi)存,所以不知道如何釋放對象的“特殊”內(nèi)存。為解決這個問題,Java提供了一個名為finalize()的方法,它的工作原理應(yīng)該是這樣的:一旦垃圾收集器準(zhǔn)備好釋放對象占用的存儲空間,它首先調(diào)用finalize(),而且只有在下一次垃圾收集過程中,才會真正回收對象的內(nèi)存。所以如果使用finalize(),就可以在垃圾收集期間進行一些重要的清除或清掃工作(如關(guān)閉流等操作)。但JVM(Java虛擬機)不保證此方法總被調(diào)用。
Finalize 操作具有下列限制:
垃圾回收過程中執(zhí)行終結(jié)器的準(zhǔn)確時間是不確定的。不保證資源在任何特定的時間都能釋放,除非調(diào)用 Close 方法或 Dispose 方法。
即使一個對象引用另一個對象,也不能保證兩個對象的終結(jié)器以任何特定的順序運行。即,如果對象 A 具有對對象 B 的引用,并且兩者都有終結(jié)器,則當(dāng)對象 A 的終結(jié)器啟動時,對象 B 可能已經(jīng)終結(jié)了。
運行終結(jié)器的線程是未指定的。
在下面的異常情況下,F(xiàn)inalize 方法可能不會運行完成或可能根本不運行:
另一個終結(jié)器無限期地阻止(進入無限循環(huán),試圖獲取永遠無法獲取的鎖,諸如此類)。由于運行時試圖運行終結(jié)器來完成,所以如果一個終結(jié)器無限期地阻止,則可能不會調(diào)用其他終結(jié)器。
進程終止,但不給運行時提供清理的機會。在這種情況下,運行時的第一個進程終止通知是 DLL_PROCESS_DETACH 通知。
在關(guān)閉過程中,只有當(dāng)可終結(jié)對象的數(shù)目繼續(xù)減少時,運行時才繼續(xù) Finalize 對象。
finally在異常處理時提供finally塊來執(zhí)行所有清除操作。主要與try-catch-finally配合使用。
finally語句塊的作用是無論出現(xiàn)什么情況,finally塊中的語句一定會被執(zhí)行,并且是在return之前執(zhí)行。根據(jù)JAVA規(guī)范,如果try-finally或者catch-finally中都有return,則2個return都執(zhí)行并最終返回調(diào)用者那里的是finally中的return,如果finally中沒有return則返回的是catch中的return,但是finally中的代碼也是要執(zhí)行的。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“C++中final, finally, finalize的區(qū)別有哪些”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。