10

私はこのようなクラスを持っています:

class Test{
public:
  Test(string value);
  Test(bool value);

};

次のようなオブジェクトを作成すると:

Test test("Just a test...");

bool コンストラクターが呼び出されます。

誰でも理由を知っていますか?

ありがとう

4

6 に答える 6

18

の型は"Just a test..."isconst char *であり、暗黙的に または のいずれboolかに変換できますstd::stringstd::stringは組み込み型ではないため、 const char *s は に変換されboolます。を明示的に に変換することで、これを防ぐことができconst char *ますstd::string

Test test(std::string("Just a test..."));
于 2010-08-06T15:04:16.123 に答える
8

これはよく知られている C++ の問題です。

文字列リテラルには、chat const[] のタイプがあります。2 つのコンストラクターがあり、char const[] から Test への変換シーケンスは次のようになります。

1) char const[] -> char const* -> bool

2) char const[] -> char const* -> std::string

1) は組み込みの標準変換ですが、2) はユーザー定義の変換です。組み込みの変換はユーザー定義の変換よりも優先されるため、文字列リテラルは std::string よりも bool に簡単に変換されます。

于 2010-08-06T15:09:00.143 に答える
4

の型は"Just a test..."ですconst char*boolからへの非組み込み変換よりも優先される組み込みのポインターからへの変換がありconst char*ますstd::string

ブール変換が推奨される理由std::stringは、標準ライブラリの一部であるが、整数、ポインター、およびブール値のような組み込み型ではないためです。他のクラスと同様に動作するため、その変換コンストラクターは、組み込み型への変換後にのみ考慮されます。

于 2010-08-06T15:06:46.960 に答える
3

この問題を回避する 1 つの方法は、const char* を受け取り、明示的に std::string に変換する別のコンストラクターを提供することです。

于 2010-08-06T16:43:07.437 に答える
1

1 つの引数しかとらないコンストラクター (特に複数のコンストラクター) がある場合は、この種の驚きを避けるために、それらを "明示的" に宣言するのが適切な場合があります。これにより、クラスのユーザーは、使用したいコンストラクターに正しい型を与えることを確認し、これらの暗黙的な型変換がユーザーの背後で行われ、見つけにくいバグが隠されるのを防ぐことができます。

http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=15&​​rll=1

C++0x では、同じ問題を防ぐために、これが変換演算子に拡張されました。

http://www2.research.att.com/~bs/C++0xFAQ.html#explicit-conversion

于 2010-08-06T17:23:38.573 に答える
0

1 つの方法は、std::string 型の変数を作成し、その変数を次のように渡すことです。

std::string test = "TEST";
A a(test);

このようにしstd::stringて、受け入れるコンストラクターにデフォルト設定されないため、型が明示的に定義されますbool

于 2010-08-06T16:22:00.687 に答える