final
編程語言關鍵字
Final英文意思是:最終的; 決定性的; 不可更改的; 決賽; 結局; 期末考試。也是多種編程語言的關鍵字或保留字。
C++11標準提供了說明符final。需要注意的是,C++11中的final不是關鍵字,而是說明符,這意味著您可以將它(在不引起混淆的情況下)將它作為標識符使用(為了兼容以前的代碼)。類似的說明符還有override。Java 和AS3.0關鍵字final有“這是無法改變的”或者“終態的”含義,它可以修飾非抽象類、非抽象類成員方法和變數。你可能出於兩種理解而需要阻止改變:設計或效率。
C++11標準提供了說明符final,用於阻止派生類覆蓋特定的虛方法。或是阻止一個類成為基類。
語法1:class Someclass final {...};
語法2:class Someclass {...type somefun(arg-list) final;...};
舉例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include classX { private: charc; public: X():c('B'){} X(chararg):c(arg){} virtualvoidput()constfinal{std::cout< //final修飾了put()函數,使其不能被覆蓋 //... }; classY:publicX { inti; public: Y():i(0){} Y(intarg):i(arg){} //這裡不能有voidput();了,因為有了final說明符 //... }; classZfinal//final修飾Z類,您不能從Z類派生出一個類,而只能用於創建對象 { private: doubled; public: Z():d(0.0){} Z(doublearg):d(arg){} voidput()const{std::cout< //... }; intmain() { usingnamespacestd; charfinal='X';//可以這麼做 Xx(final); x.put();//輸出X Yy; y.put();//輸出B Zz(3.14159); z.put();//輸出3.14159 return0; } |
1、final類
final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會再被擴展,那麼就設計為final類。 final方法不能被子類的方法覆蓋,但可以被繼承。
2、final方法
如果一個類不允許其子類覆蓋某個方法,則可以把這個方法聲明為final方法。
使用final方法的原因有二:
第一、把方法鎖定,防止任何繼承類修改它的意義和實現。
第二、高效。編譯器在遇到調用final方法時候會轉入內嵌機制,大大提高執行效率。
3、final變數(常量)
用final修飾的成員變數表示常量,只能被賦值一次,賦值后值無法改變!
從下面的例子中可以看出,一旦給final變數初值后,值就不能再改變了。
另外,final變數定義的時候,可以先聲明,而不給初值,這種變數也稱為final空白,無論什麼情況,編譯器都確保空白final在使用之前必須被初始化。但是,final空白在final關鍵字final的使用上提供了更大的靈活性,為此,一個類中的final數據成員就可以實現依對象而有所不同,卻有保持其恆定不變的特徵。
4、final參數
當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值。
註:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認是final類型的。
final不能用於修飾構造方法。
示例:
public void f1(final int i){ } //i是final類型的,值不允許改變的.