3

クラス String があるとします。

class String {
   public: 
   String (int n);
   String(const char *p);
}

試してみるとどうなりますか:

String mystring='x';

ここでは、char 'x' を int に変換して String(int) コンストラクターを呼び出すと書かれています。しかし、私はそれを理解していません。

まず、「x」を int に変換する方法を教えてください。"3"が変換されることは想像できます3が、「x」は何に変換されるのでしょうか? 次に、クラスに 2 つのコンストラクターがあります。最初のコンストラクターは int 型の引数を 1 つ取り、別のコンストラクターは char 変数へのポインターを引数として取ります。ここで、char を引数として取る、存在しないコンストラクターを呼び出そうとします。では、char を整数に変換しますが、char を char へのポインターに変換してから 2 番目のコンストラクターを使用しないのはなぜでしょうか?

4

3 に答える 3

9

まず、「x」を int に変換する方法を教えてください。「3」は「3」に変換されると想像できますが、「x」は何に変換されるのでしょうか?

と を混同しないで'x'ください"x"

  • "x"intは文字列リテラルであり、そのとおりです。これを;に変換しようとしても意味がありません。
  • 'x'文字リテラルであり、基本的にはすでに数値です (基本的なソース文字セットxで文字がマップされるものの基になる値に等しい; ASCII の場合、これは です); これを整数に変換するのは簡単です。120

では、char を整数に変換しますが、char を char へのポインターに変換してから 2 番目のコンストラクターを使用しないのはなぜでしょうか?

C++ には、どれが「最適な一致」であるかを管理する規則があります。この場合、それはintオーバーロードです。両方が等しい場合、コンパイラは「あいまいなオーバーロード」エラーを表示し、どちらが必要かを指示するために'x' 明示的に(キャストを使用して手動で) 変換する必要があります。

あなたの場合、非ポインターは実際にはポインターに変換できないため、これは問題ではありません。

于 2013-04-05T13:58:37.257 に答える