轉載請註明文章出處:tlanyan.me/cpp-functio…
C++
博大精深,而且不斷擁抱新的變化。本文簡要總結一下C++
中函式的修飾符,其中部分在實際中極少用到。
按修飾符的位置分為函式名前與函式名後兩種,以下分別做介紹。
函式名前
-
返回值型別
返回值型別是
C++
中定義函式的必備部分,這些修飾符包括void
,(unsigned) int
,bool
等內建基本資料型別和自定義型別,也包括修飾返回值const
關鍵字(如const int*
),還包括C++11
中新增的型別自動推導auto
關鍵字。 -
template
template
關鍵字宣告函式是模板函式。 -
virtual
virtual
關鍵字宣告函式是虛擬函式,可被子類覆蓋。 -
inline
inline
關鍵字提示編譯器應將函式內聯。 -
static
static
修飾類的成員函式時指示函式是靜態成員函式,不從屬於具體物件;修飾單獨的函式時,限定函式的可見範圍為本檔案內。 -
extern
extern
關鍵字宣告一個定義在外部的函式 -
explicit
explicit
關鍵字在C++11
新增,只用於建構函式,指定建構函式要顯式定義,不能隱式轉換。 -
friend
friend
關鍵字宣告類的友元函式,在函式內可直接訪問物件的私有或受保護成員及成員函式。 -
constexpr
C++11
中新增,指示函式返回常量表示式(可以簡單理解為返回字面量)。
函式名後
置於函式名後的修飾符有兩種,第一種使用等號(=
),第二種直接修飾。
-
使用等號
此類較為簡單,總共有三種:
-
=0
:只能用於虛擬函式,表示函式為純虛擬函式。 -
=default
:C++11
新增,只能用於編譯器提供預設實現的特殊成員函式,指示使用預設實現。 -
=delete
:C++11
新增,只能用於編譯器提供預設實現的特殊成員函式,指示編譯器應該刪除該函式的預設實現。
-
-
直接修飾
種類繁多,本人已知的修飾符包括:
-
const
表示函式不會修改物件(或者說呼叫期間物件不變),注意不包括
mutable
修飾的成員變數,可參考本人之前文章:C++中的mutable和volatile。 -
volatile
類似於
const
修飾的函式,表示物件狀態可能隨時會改變;const
修飾的函式內只能呼叫自身的const
成員方法,同理volatile
函式內也只能呼叫自身volatile
成員函式。 -
&
C++11
引入的功能,左值引用限定符,指示函式只能被左值物件呼叫。 -
&&
C++11
引入,右值引用限定符,指示函式只能被右值呼叫。如果函式沒有引用限定符修飾,左值和右值均可呼叫。一個引用限定例子:#include <iostream> struct S { void f() & { std::cout << "lvalue\n"; } void f() &&{ std::cout << "rvalue\n"; } }; int main(){ S s; s.f(); // 列印“ lvalue ” std::move(s).f(); // 列印“ rvalue ” S().f(); // 列印“ rvalue ” } 複製程式碼
-
override
C++11
引入的功能,宣告成員函式覆蓋父類的虛擬函式。宣告為override
後,子類宣告時可不寫virtual
。 -
final
C++11
引入,指示函式是最終實現,子類不應當再定義或覆蓋,可與override
同時使用。 -
noexcept
C++11
引入,修飾函式是否會丟擲異常。 -
throw
指示函式丟擲異常及型別,
C++11
起被廢棄。
-
總結
本文簡要概括的列出了C++
定義函式的修飾符。需要注意的是,嚴格來說上述內容中並不全是修飾符,部分僅是語法結構。