C++函式修飾符總結

tlanyan發表於2019-02-03

轉載請註明文章出處:tlanyan.me/cpp-functio…

C++博大精深,而且不斷擁抱新的變化。本文簡要總結一下C++中函式的修飾符,其中部分在實際中極少用到。

按修飾符的位置分為函式名前與函式名後兩種,以下分別做介紹。

函式名前

  1. 返回值型別

    返回值型別是C++中定義函式的必備部分,這些修飾符包括void(unsigned) intbool等內建基本資料型別和自定義型別,也包括修飾返回值const關鍵字(如const int*),還包括C++11中新增的型別自動推導auto關鍵字。

  2. template

    template關鍵字宣告函式是模板函式

  3. virtual

    virtual關鍵字宣告函式是虛擬函式,可被子類覆蓋。

  4. inline

    inline關鍵字提示編譯器應將函式內聯

  5. static

    static修飾類的成員函式時指示函式是靜態成員函式,不從屬於具體物件;修飾單獨的函式時,限定函式的可見範圍為本檔案內

  6. extern

    extern關鍵字宣告一個定義在外部的函式

  7. explicit

    explicit關鍵字在C++11新增,只用於建構函式,指定建構函式要顯式定義,不能隱式轉換

  8. friend

    friend關鍵字宣告類的友元函式,在函式內可直接訪問物件的私有或受保護成員及成員函式。

  9. constexpr

    C++11中新增,指示函式返回常量表示式(可以簡單理解為返回字面量)。

函式名後

置於函式名後的修飾符有兩種,第一種使用等號(=),第二種直接修飾。

  1. 使用等號

    此類較為簡單,總共有三種:

    1. =0:只能用於虛擬函式,表示函式為純虛擬函式

    2. =defaultC++11新增,只能用於編譯器提供預設實現的特殊成員函式,指示使用預設實現

    3. =deleteC++11新增,只能用於編譯器提供預設實現的特殊成員函式,指示編譯器應該刪除該函式的預設實現

  2. 直接修飾

    種類繁多,本人已知的修飾符包括:

    1. const

      表示函式不會修改物件(或者說呼叫期間物件不變),注意不包括mutable修飾的成員變數,可參考本人之前文章:C++中的mutable和volatile

    2. volatile

      類似於const修飾的函式,表示物件狀態可能隨時會改變const修飾的函式內只能呼叫自身的const成員方法,同理volatile函式內也只能呼叫自身volatile成員函式。

    3. &

      C++11引入的功能,左值引用限定符,指示函式只能被左值物件呼叫。

    4. &&

      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 ”
        }
      複製程式碼
    5. override

      C++11引入的功能,宣告成員函式覆蓋父類的虛擬函式。宣告為override後,子類宣告時可不寫virtual

    6. final

      C++11引入,指示函式是最終實現,子類不應當再定義或覆蓋,可與override同時使用。

    7. noexcept

      C++11引入,修飾函式是否會丟擲異常

    8. throw

      指示函式丟擲異常及型別,C++11起被廢棄

總結

本文簡要概括的列出了C++定義函式的修飾符。需要注意的是,嚴格來說上述內容中並不全是修飾符,部分僅是語法結構。

相關文章