デフォルトコンストラクション関数と合成デフォルトコンストラクション関数
1601 ワード
クラス内のオブジェクトに初期値を指定しない場合、デフォルトの初期化が実行されます.クラスは特殊な構造関数によってデフォルトの初期化プロセスを制御します.この関数をデフォルト構造関数と呼びます.この関数には実パラメータは必要ありませんが、クラスが構造関数を明示的に定義していない場合は、コンパイラは、デフォルトのコンストラクタを暗黙的に定義します(コンストラクタを明示的に定義しない限り、コンパイラはデフォルトのコンストラクタを提供し、クラス内のオブジェクトに初期値を指定すると、デフォルトの初期化プロセスは制御されません).
実際、デフォルトコンストラクション関数は必ずしもコンパイラが暗黙的に提供しているわけではなく、ユーザーが自分で書いた可能性があります.前提は、ユーザーがもともと他のコンストラクション関数を書いたことがあるが、このようなデフォルトコンストラクション関数が必要な場合、ユーザーが自分で書く必要があります.この場合、パラメータのないコンストラクション関数がコンストラクション関数です.ただし、このときのコンストラクション関数と、コンストラクション関数が定義されていないためコンパイラが暗黙的に定義した合成のデフォルトコンストラクション関数を同じにするには、宣言の後に=defaultと書くだけでよい.次のようになります.
システムの暗黙的なデフォルト構造関数については、合成されたデフォルト構造関数と呼ばれます.
しかし、実際には、一部の場合、独自に定義されたコンストラクション関数がありますが、デフォルトコンストラクション関数を表示する必要があります(ただし、合成コンストラクション関数ではないに違いありません.デフォルトコンストラクション関数は、暗黙的なコンパイラ独自の合成デフォルトコンストラクション関数のほかに、前例のように表示する必要があります).
多くの場合、コンストラクション関数を表示しても、デフォルトコンストラクション関数を表示して与える必要があります.具体的には、デフォルト初期化と値初期化の2つに分けられます.
デフォルトの初期化は次のとおりです.
1、クラスの役割ドメイン内で任意の初期値を使用して非静的変数またはデータを定義する場合.
2.1つのクラス自体がクラスタイプのメンバーを含み、含まれているこのクラスタイプのメンバーが合成されたデフォルト構造関数を使用する場合.
3、クラスタイプのメンバーがコンストラクション関数の初期値リストで明示的に初期化されていない場合.
値の初期化は次のとおりです.
1、配列の初期化の過程で、もし私たちが提供した初期値の数が配列の大きさより少ない場合.
2、初期値を用いて局所静的変数を定義しない場合.
3、T()のような形式の式を書くことによって値の初期化を明示的に要求する場合、Tはタイプ名であり、例えばvector()ではvectorの要素の個数を説明するために1つの実パラメータしか使用できないが、括弧の中でクラスであれば;
したがって、以上のような場合があるため、既にコンストラクション関数が存在する場合(すなわち、この場合デフォルトコンストラクション関数が合成されていない場合はデフォルトコンストラクション関数がない)は、デフォルトコンストラクション関数をアクティブに明示的に指摘する必要があるため、C++primerではコンストラクション関数がすでに存在する場合でも推定される.
実際、デフォルトコンストラクション関数は必ずしもコンパイラが暗黙的に提供しているわけではなく、ユーザーが自分で書いた可能性があります.前提は、ユーザーがもともと他のコンストラクション関数を書いたことがあるが、このようなデフォルトコンストラクション関数が必要な場合、ユーザーが自分で書く必要があります.この場合、パラメータのないコンストラクション関数がコンストラクション関数です.ただし、このときのコンストラクション関数と、コンストラクション関数が定義されていないためコンパイラが暗黙的に定義した合成のデフォルトコンストラクション関数を同じにするには、宣言の後に=defaultと書くだけでよい.次のようになります.
class Sales{
Sales()=default;
// ,
}
システムの暗黙的なデフォルト構造関数については、合成されたデフォルト構造関数と呼ばれます.
しかし、実際には、一部の場合、独自に定義されたコンストラクション関数がありますが、デフォルトコンストラクション関数を表示する必要があります(ただし、合成コンストラクション関数ではないに違いありません.デフォルトコンストラクション関数は、暗黙的なコンパイラ独自の合成デフォルトコンストラクション関数のほかに、前例のように表示する必要があります).
多くの場合、コンストラクション関数を表示しても、デフォルトコンストラクション関数を表示して与える必要があります.具体的には、デフォルト初期化と値初期化の2つに分けられます.
デフォルトの初期化は次のとおりです.
1、クラスの役割ドメイン内で任意の初期値を使用して非静的変数またはデータを定義する場合.
2.1つのクラス自体がクラスタイプのメンバーを含み、含まれているこのクラスタイプのメンバーが合成されたデフォルト構造関数を使用する場合.
3、クラスタイプのメンバーがコンストラクション関数の初期値リストで明示的に初期化されていない場合.
値の初期化は次のとおりです.
1、配列の初期化の過程で、もし私たちが提供した初期値の数が配列の大きさより少ない場合.
2、初期値を用いて局所静的変数を定義しない場合.
3、T()のような形式の式を書くことによって値の初期化を明示的に要求する場合、Tはタイプ名であり、例えばvector()ではvectorの要素の個数を説明するために1つの実パラメータしか使用できないが、括弧の中でクラスであれば;
したがって、以上のような場合があるため、既にコンストラクション関数が存在する場合(すなわち、この場合デフォルトコンストラクション関数が合成されていない場合はデフォルトコンストラクション関数がない)は、デフォルトコンストラクション関数をアクティブに明示的に指摘する必要があるため、C++primerではコンストラクション関数がすでに存在する場合でも推定される.