この切り替えtiankong19999
まず、明示的なC ++キーワードは、それはむしろ暗黙のより、コンストラクタであることの効果であるクラスのコンストラクタのパラメータのみ変更にのみ使用され、別のキーワードは、暗黙的なことを言ってに対応します、暗黙の(暗黙の)として宣言されて隠されたデフォルトコンストラクタクラスを意味します。
?そして、それは私たちが次の例を見て作るんどのような違いのコンストラクタ暗黙的に宣言宣言が表示されます。
1 クラス CxString // 明示的な使用キーワードクラス宣言、すなわち、暗黙デフォルト文 2 { 3。 公共: 4 のchar * _pstr; 5 int型_size; 6 CxString(int型のサイズ) 。7 { 8。 _size =サイズ; // 文字列デフォルトサイズ 9。 _pstr = malloc関数(サイズ+ 1); // のメモリストリング割り当て 10 のmemset(_pstr、0、+サイズ1。 ) 。11 } 12で CxString(CONST 文字 * P) 13である { 14 INTのサイズ= (P)strlenを、 15 _pstr = malloc関数(サイズ+ 1); // メモリストリングを割り当て 16 strcpyの(_pstr、P); // コピー列 17 = _size STRLEN(_pstr); 18れる } 19。 // デストラクタがここで説明されていない、省略する... 20 }; 21は 22である 。// 次の呼び出しである: 23である 24 CxStringの文字列1(24); // これはCxString予め割り当てられたメモリサイズ24バイトのためにOKです 25 CxString文字列2 = 10 ; // これはOK、事前CxString用メモリの10バイトのサイズ分布である 26であること はstring3をCxString; // これはデフォルトコンストラクタがないため、受け入れられない、エラーがある: "CxString":いいえ、適切なデフォルトコンストラクタ利用できる 27 CxString STRING4(" AAAA "); // これはOKである 28 CxString STRING5 = " BBB " ; // そのようなOKであり、呼び出しがCxString(CONST文字* P)が 29 CxString string6 = ' C ' ; //そのようなOKであり、コールが実際に(INTサイズ)CxStringされ、サイズが「C」のASCIIコードに等しい 30 文字列1 = 2 ; // これはOKであり、割り当てられたメモリサイズは2バイトであるCxString予め 31である 文字列2 = 3 ; // これはOK、CxStringの事前に割り当てられた3バイトのメモリサイズである 32 はstring3 = string1の; // これはOKで、少なくとも、コンパイラは問題ありませんが、デストラクタが自由_pstrでリリースされている場合完全なコードは、演算子をオーバーライドする必要がある場合、メモリポインタは、「=」、及びで処理メモリ解放与えられてもよいです
上記のコード、「CxString string2の= 10;」コンストラクタは一つの引数を取る場合、なぜこの文は、C ++で行うことができますされ、その後、コンパイル時にデフォルトの変換操作があるでしょう。この? 「CxString文字列2 = 10;」に変換されたクラスオブジェクトに対応するコンストラクタデータタイプコードは、コンパイラが自動的に、実際に、CxStringクラスオブジェクト整数変換され、次の操作に相当します。
1 CxStringの文字列2(10 )。 2 或 3 CxStringの一時(10 )。 4 CxString文字列2 = TEMP。
目立たなり、そして、「CxString string6 = 『C』」;「CxString文字列2 = 10」と第文しかしながら、上記のコードは、文字列のサイズが_sizeメモリ割り当て、いわゆる第二文で表され簡単な疑問に答えは私たちが次のように上記のコードは、少しも変わって置く明示的なキーワードを使用することで、この用法を停止する方法はあります。?:
1 クラス CxString // キーワード明示的なクラス宣言、ディスプレイコンバータ 2 { 3。 公共: 4 のchar * _pstr; 5 int型_size; 6 明示 CxString(int型のサイズ) 。7 { 8 _size = サイズ; 9 // コードの上、説明を省略する... 10 } 。11 CxString(CONST 文字 * P) 12は、 { 13は、 // コード上、省略する... 14 } 15 }; 16 。17 // 次の呼び出しである: 18である 19。 CxStringの文字列1(24); // これはOKである 20である 文字列2 = CxString 10 ; // これは、明示的なキーワードは、暗黙的な変換キャンセルので、許容できない 21れる CxStringはstring3を; // デフォルトコンストラクタがないため、これは、仕事をしない 22 CxString STRING4(" AAAAは"); // これはOKである 23 CxString string5 = " BBB " ; // これはOKで、呼び出しはCxString(のconst char型でありますp型*) 24 String6 = CxString 「C 」 ; // これは受け入れられない、コールが実際に(INTサイズ)CxStringさ、およびサイズは、ASCIIコード「C」に等しいが、明示的なキーワードがキャンセル暗黙変換 25 文字列1 = 2 ; // 暗黙的な変換をキャンセルするので、これは、十分ではない 26である 文字列2 = 3 ; // これは暗黙の変換がキャンセルので、十分ではない 27 はstring3 =文字列1; // 暗黙的な変換は、クラスがない限りキャンセルので、これは十分ではありません演算子「=」リロードを実装
明示的に重要な役割は、暗黙のオートチェンジャクラスのコンストラクタを防ぐためである。
すでに述べた上でも、クラスのコンストラクタのパラメータがより大きく、または2に等しい場合には、明示的なキーは、クラスのコンストラクタの引数に対してのみ有効である、さ暗黙の変換は、それはまた、不正な明示的なキーワードではありませんよう:
1 クラス CxString // 明示的なキーワードは、クラスのコンストラクタのパラメータの間に不活性であるが2以上である 2 { 3。 公共: 4 のchar * _pstr; 5 int型_age; 6 int型_size; 7 明示 CxString(INT年齢、int型のサイズ) 。8 { 9 _age = 年齢; 10 _size = サイズ; 11 // コード上は、省略する... 12である } 13で CxString(CONST 文字 *P) 14 { 15 // コード前掲を省略... 16 } 17 }; 18である 。19 // 明示的なキーワードは同じではないがあり、このとき
しかし、ある一つの例外が、そこにある最初のパラメータに加えて、他のパラメータは、時間のデフォルト値を持っている場合、明示的なキーワードは、唯一つのパラメータに相当し、コンストラクタが唯一のパラメータを渡す呼び出されたときに、この時点では、まだ有効ですクラスのコンストラクタ次のように、例を示します。
1 クラス CxString // キーワード明示文 2 { 3。 公共: 4 int型_age; 5 int型_size; 6 明示 CxString(INT年齢、int型のサイズ= 0 ) 。7 { 8。 _age = 年齢; 9。 _size = サイズ; 10 // コードは省略前掲... 11 } 12は CxString(CONST 文字 * P) 13です { 14 // コード前掲を省略... 15 } 16 ;} 17 18である 。// 次の呼び出しである: 19 20である CxString文字列1(24); // これはOKで 21れる CxString文字列2 = 10 ; // これは受け入れられません、明示的なキーワードは、暗黙的な変換キャンセルので 22である CxStringのはstring3; // デフォルトのコンストラクタがあるため、これは、許容できない 23はしない 文字列1 = 2 ; // 暗黙的な変換をキャンセルするので、これは、十分ではない 24 文字列2 = 3 ; // これは、暗黙の型変換の廃止で、十分ではありません 25 はstring3 =文字列1; // 暗黙的な変換は、クラスが実装演算子「=」リロードしない限り解除するので、これは、十分ではありません