、定数式:それは変更されない値を参照し、計算結果は、コンパイル式中得ることができます。オブジェクトは、定数式は、そのデータ型と初期値によって決定されていません。
1 INT staff_size = 27 ; // 初期値は、リテラル定数であり、それだけで通常のデータint型であるが。 2 のconst int型 SZ = GET_SIZE(); // 実行時には定数式でなくなるまで自分自身をSZ間は一定であるが、それを取得するために、その特定の値
二、constexprの変数
変数の宣言は、constexprのタイプは、それが一定でなければならないconstexprの型の変数として宣言され、定数式を使用して初期化する必要がありますになります。
1 constexprのINT MF = 20 ; // 20は、定数式である 2 constexprのINT SZ =サイズ(); // サイズ()関数は、constexprのときのみ、正しい宣言です。
三、constexprの機能
constexprのconstexprの機能の変数を初期化するために使用することができ、関数の型を返すと、パラメータの種類は、すべてのリテラル型で、本体のみreturn文でと機能を。そして、constexprのと機能は、暗黙的にインライン関数として指定されています。
1 // プログラムをコンパイルする定数式new_szリターンは、戻り値をnew_sz constexprの変数foo初期化するために使用できることを確認することができ、コンパイラ 2 constexprのINT new_sz(){ 返す 42である;} 。3 constexprのINT FOO = new_sz()。// fooが定数式であります
:また、我々は、constexprの関数の戻り値が一定でないことができ、引数が定数式である場合、関数の戻り値は定数式であります
1 // スケール引数は定数式、その戻り値は定数式である 2 constexprののsize_tのスケール(size_t型CNT){ 戻り new_sz()} * CNT
第四に、再びリテラル型に導入
算術型、参照、ポインタ、クラスリテラル定数は、列挙型はリテラルのタイプです。そして、他のカスタムクラスは、IOライブラリは、STLライブラリは、リテラルのタイプに属していません。ポインタや参照がconstexprのように定義することができますが、が、その初期値が厳しく制限されます。例えば:ポインタの初期値は、constexprののnullptrまたは0、または固定されたアドレスに格納されたオブジェクトである必要があり、グローバル変数または静的ローカル変数。
図1は、ポインタ型にリテラル導入:かかわらず、ポインタ・オブジェクトの唯一の修飾子constexprの有効なポインタを、。
1つ のconst intが * P = nullptr; // Pがポインタ整数定数へのポインタである 2 constexprののINT * P = nullptr; // Pは整数定数を指すポインタである 3 // それがオブジェクトに設定constexprの定義されていることmaxburgのCONST、及びこれを次のよう。 4 INT * CONST P; // Pは整数に一定のポインタである 5 // ocnstexprは一定のポインタであるので、それは両方の点を指すことができるが、一定量です。 6 。7 INT J = 0 ; 8 constexptrのint型 I = 0 ; 9 10 constexprのののconst int型 * P = I; //pは一定のポインタ整数定数である 11。 constexprのint型 *のP1 = J; // P1は、整数jに対して一定のポインタである 12は 13である // 注意:i、jは、すなわち、に格納する必要があり、関数の外に定義されなければなりません固定アドレスのオブジェクト。
2は、その後、クラスリテラルに導入します
リテラルデータメンバのタイプは、ポリマーリテラルクラスのクラスです。リテラルのカテゴリは、以下のクラスに準拠しています:
- メンバーは、リテラルのデータ型です
- クラスは、少なくとも一つ含まれている必要がありますconstexprのコンストラクタをこの関数は、彼らは暗黙のconstのあるconstexprの機能すべての要件を満たす必要があります。
- クラスのデータメンバが初期値が含まれている場合は、初期値データの組み込みのメンバーは定数式でなければなりません。メンバーは、特定のクラス型に属している場合、メンバーの初期値は、それ自体がコンストラクタをconstexprの必要があります。
- このクラスは、デフォルトで定義されたデストラクタは、オブジェクトクラスの破壊のための責任ある一員を使用する必要があります。
コンストラクタは、(我々はconstオブジェクトクラスを作成するときに、オブジェクトを初期化する唯一のコンストラクタは本当に一定の属性を取得することができますので)constはすることはできませんが、クラスのコンストラクタリテラルはconstexprのことができますが。
1 クラスのデバッグ{ 2 公共: 3 // constexprのコンストラクタは初期値constexprのコンストラクタまたは定数式を使用して、すべてのデータメンバを初期化しなければなりません。 4 デバッグ(constexprのBOOL B = トゥーレ):HW(B)、IO(B)、その他(B){} 5。 デバッグ(constexprのBOOL H、BOOL I、BOOL O): 6 HW(H)、IO(I) 、その他(O){} 7。 cosntexpr BOOL任意の(){ 戻り HW IO || || OTHERを;} 。8 ボイド set_io(BOOLの B)IO = { B;} 。9 ボイド set_hw(ブール B){HW = B;} 10 空隙 set_other(ブール B){他= B;} 11 プライベート: 12 BOOL HW。 13 ブールIO。 14 BOOL その他; 15 16 }
3.列挙型への再導入
これは、2つのC ++の列挙が含まれています。スコープをスコープと限定されるものではありません。