我有一个类似这样的课程:
class Test{
public:
Test(string value);
Test(bool value);
};
如果我创建这样的对象:
Test test("Just a test...");
调用bool构造函数!
任何人都知道为什么?
由于
答案 0 :(得分:18)
"Just a test..."
的类型为const char *
,可以隐式转换为bool
或std::string
。由于std::string
不是内置类型,因此const char *
会转换为bool
。您可以通过明确地将const char *
转换为std::string
:
Test test(std::string("Just a test..."));
答案 1 :(得分:8)
这是众所周知的C ++烦恼。
您的字符串文字具有聊天const []的类型。你有两个构造函数,从char const []到Test的转换序列如下所示:
1)char const [] - > char const * - >布尔
2)char const [] - > char const * - >的std :: string
1)是内置的标准转换,而2)是用户定义的转换。内置转换优先于用户定义的转换,因此您的字符串文字转换为bool比转换为std :: string更容易。
答案 2 :(得分:4)
"Just a test..."
的类型为const char*
。指针指向bool
的内置转换优先于从const char*
到std::string
的非内置转换。
首选bool转换的原因是std::string
,而标准库的一部分,不是内置类型,如整数,指针和布尔值。它的行为与任何其他类一样,因此只有在转换为内置类型后才会考虑其转换构造函数。
答案 3 :(得分:3)
解决这个问题的一种方法是提供另一个构造函数,它接受一个const char *然后显式转换为std :: string。
答案 4 :(得分: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
答案 5 :(得分:0)
一种方法是创建一个std :: string类型的变量,并将变量传递给:
std::string test = "TEST";
A a(test);
这样,类型被明确定义为std::string
,它不会默认为接受bool
的构造函数