为什么我的重载C ++构造函数没有被调用?

时间:2010-08-06 15:01:31

标签: c++ constructor constructor-overloading

我有一个类似这样的课程:

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

};

如果我创建这样的对象:

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

调用bool构造函数!

任何人都知道为什么?

由于

6 个答案:

答案 0 :(得分:18)

"Just a test..."的类型为const char *,可以隐式转换为boolstd::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的构造函数