我正在尝试编写一个包含一些重载方法的C++类:
class Output
{
public:
static void Print(bool value)
{
std::cout << value ? "True" : "False";
}
static void Print(std::string value)
{
std::cout << value;
}
};
Run Code Online (Sandbox Code Playgroud)
现在让我说我调用方法如下:
Output::Print("Hello World");
Run Code Online (Sandbox Code Playgroud)
结果就是这样
真正
那么,为什么,当我定义该方法可以接受布尔值和字符串时,当我传入一个非布尔值时,它是否使用布尔重载?
编辑:我来自C#/ Java环境,对C++来说还是新手!
我知道关键字explicit可用于防止隐式转换.
例如
Foo {
public:
explicit Foo(int i) {}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,在什么条件下,应该禁止隐含转换?为什么隐式转换有害?
以下程序编译好并按预期工作.它的输出是:
1
2
#include <stdio.h>
class Foo
{
public:
void Bar(const char* b, ...) { printf("1\n"); };
void Bar(int a, const char* b, ...) { printf("2\n"); };
};
int main()
{
Foo foo1;
foo1.Bar("Test", "xx", 1, 2);
foo1.Bar(1, "xx", "xx", 2, 2);
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我改变int的第二个参数Bar的功能为bool和foo1.Bar(1, "xx", "xx", 2, 2);成foo1.Bar(true, "xx", "xx", 2, 2);,那么,下面一行将无法编译,我得到的错误:'Foo::Bar': 2 overloads have similar conversions:
foo1.Bar("Test", "xx", 1, 2);
Run Code Online (Sandbox Code Playgroud)
整个程序不编译:
#include <stdio.h>
class Foo
{
public: …Run Code Online (Sandbox Code Playgroud)