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