10

我有一堂像这样的课:

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

};

如果我创建这样的对象:

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

bool 构造函数被调用!

有谁知道为什么?

谢谢

4

6 回答 6

18

"Just a test..."is的类型const char *,可以隐式转换为boolor std::string。因为std::string不是内置类型,所以const char *s 被转换为 a bool。您可以通过将 显式转换const char *为 a来防止这种情况发生std::string

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

这是众所周知的 C++ 烦恼。

您的字符串文字的类型为聊天 const[]。您有两个构造函数,从 char const[] 到 Test 的转换序列如下所示:

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

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

1) 是内置的标准转换,而 2) 是用户定义的转换。内置转换优先于用户定义的转换,因此您的字符串文字转换为 bool 比转换为 std::string 更容易。

于 2010-08-06T15:09:00.143 回答
4

的类型"Just a test..."const char*。有一个从指针到的内置转换优于从到bool的非内置转换。const char*std::string

首选 bool 转换的原因是std::string,虽然是标准库的一部分,但它不是整数、指针和布尔值等内置类型。它的行为与任何其他类一样,因此仅在转换为内置类型之后才考虑其转换构造函数。

于 2010-08-06T15:06:46.960 回答
3

解决此问题的一种方法是提供另一个构造函数,该构造函数采用 const char*,然后显式转换为 std::string。

于 2010-08-06T16:43:07.437 回答
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-convertion

于 2010-08-06T17:23:38.573 回答
0

一种方法是创建 std::string 类型的变量并将变量传入:

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

这样,类型被显式定义,因为std::string它不会默认为接受的构造函数bool

于 2010-08-06T16:22:00.687 回答