我有一堂像这样的课:
class Test{
public:
Test(string value);
Test(bool value);
};
如果我创建这样的对象:
Test test("Just a test...");
bool 构造函数被调用!
有谁知道为什么?
谢谢
我有一堂像这样的课:
class Test{
public:
Test(string value);
Test(bool value);
};
如果我创建这样的对象:
Test test("Just a test...");
bool 构造函数被调用!
有谁知道为什么?
谢谢
"Just a test..."
is的类型const char *
,可以隐式转换为bool
or std::string
。因为std::string
不是内置类型,所以const char *
s 被转换为 a bool
。您可以通过将 显式转换const char *
为 a来防止这种情况发生std::string
:
Test test(std::string("Just a test..."));
这是众所周知的 C++ 烦恼。
您的字符串文字的类型为聊天 const[]。您有两个构造函数,从 char const[] 到 Test 的转换序列如下所示:
1) char const[] -> char const* -> bool
2) char const[] -> char const* -> std::string
1) 是内置的标准转换,而 2) 是用户定义的转换。内置转换优先于用户定义的转换,因此您的字符串文字转换为 bool 比转换为 std::string 更容易。
的类型"Just a test..."
是const char*
。有一个从指针到的内置转换优于从到bool
的非内置转换。const char*
std::string
首选 bool 转换的原因是std::string
,虽然是标准库的一部分,但它不是整数、指针和布尔值等内置类型。它的行为与任何其他类一样,因此仅在转换为内置类型之后才考虑其转换构造函数。
解决此问题的一种方法是提供另一个构造函数,该构造函数采用 const char*,然后显式转换为 std::string。
当您有一个只接受一个参数的构造函数(尤其是多个构造函数)时,可能适合将它们声明为“显式”以避免这些意外。这迫使类的用户确保他为他希望使用的构造函数提供正确的类型,并防止这些隐式类型转换在用户背后完成并隐藏难以发现的错误。
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
一种方法是创建 std::string 类型的变量并将变量传入:
std::string test = "TEST";
A a(test);
这样,类型被显式定义,因为std::string
它不会默认为接受的构造函数bool