C++11新特性のdefaulted関数

1630 ワード

背景
C++クラスには、デフォルトのコンストラクション関数、コンストラクション関数など、いくつかの特殊なメンバー関数があります.プログラマが特殊なメンバー関数を明示的に定義していない場合、コンパイラはこのクラスのデフォルトのメンバー特殊関数を暗黙的に生成します.
このデフォルトで生成された特殊なメンバー関数は、より高いコード実行効率を得ることができます.
次の例
class T {
    private:  
        int apple;
};

次の操作を実行すると、コンストラクション関数は定義されず、tで定義されるとコンストラクション関数が必要になるため、コンパイラはデフォルトのコンストラクション関数を暗黙的に生成します.このデフォルトで生成されたコンストラクション関数にはパラメータがなく、空の関数体T::T(){}が含まれているため、コンストラクション関数は定義されていませんが、コンパイルすることができます.
T t;

クラスに表示されるデフォルト以外のコンストラクタが定義されている場合は、次のようにします.
class T {
    private:
        int apple;
    public:
        T(int banana) { apple = banana; }
}

この場合、デフォルト以外のコンストラクタを定義しているため、コンパイラはデフォルトのコンストラクタを自動的に生成しないため、次の例のコンパイラがエラーを報告します.
T t; // error, default constructor T::T() doesn't exist

デフォルトのコンストラクション関数を明示的に定義すると、コンパイラによって完了した作業がプログラマーに移行します.これはプログラマの作業を増大させるに違いありません.また、明示的に定義されたデフォルト構造関数のコード実行効率は、コンパイラが生成しないデフォルト構造関数コードの実行効率が高いです.
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(){}を自動的に生成し、より高いコード実行効率を得ることができる.
Note defaulted はクラスの特殊なメンバー関数にのみ適用され、関数にはデフォルトの実パラメータを含む実パラメータがなく、関数体がありません.