C++11新特性之defaulted函數

背景

C++在類中有幾個比較特殊的成員函數,如默認構造函數,析構函數等。若是程序員沒有顯式的定義一個特殊成員函數,在程序須要用到這些特殊成員函數時,編譯器會隱式的爲這個類生成一個默認的成員特殊函數。c++

這個默認生成的特殊成員函數會得到更高的代碼執行效率程序員

以下示例app

class T {
    private:  
        int apple;
};

當咱們執行如下操做時,由於沒有定義構造函數,而t定義時又須要構造函數,因此編譯器會隱式的生成一個默認構造函數。這個默認生成的構造函數沒有參數,而且包含空的函數體T::T(){},因此雖然沒定義構造函數,可是仍是能夠編譯經過函數

T t;

若是爲類顯示的定義了非默認構造函數,以下code

class T {
    private:
        int apple;
    public:
        T(int banana) { apple = banana; }
}

這時咱們再執行如下操做,由於咱們已經定義了一個非默認構造函數,因此編譯器不會自動的爲咱們生成默認的構造函數,因此以下示例編譯器會報錯。編譯器

T t; // error, default constructor T::T() doesn't exist

若是咱們顯式的定義一個默認構造函數,那麼本來由編譯器完成的工做轉移到咱們程序員身上了。這無疑增大了程序員的工做,並且咱們顯式定義的默認構造函數的代碼執行效率沒有編譯器生成的默認構造函數代碼執行效率高io

class T {
    private:
        int apple;
    public:
        T(){}
        T(int banana) { apple = banana; }
}

Defaulted functions

基於以上幾點緣由,C++11標準引入了一個新特性,即defaulted函數。只要在顯式定義的默認構造函數後面加上=default就能夠了,以下編譯

class T {
    private:
        int apple;
    public:
        T() = default; // 默認構造函數
        T(int banana) { apple = banana; }
}

這樣編譯器就會自動生成默認構造函數T::T(){},從而得到更高的代碼執行效率。function

Note

defaulted函數只能應用於類的特殊成員函數,且函數沒有實參(包括默認實參),沒有函數體。class

相關文章
相關標籤/搜索