在下面的测试程序中,使用bool谓词调用checkit
方法会调用整数重载。为什么呢?
(i == 10)
应该创建一个布尔值,然后应该触发调用bool重载,不是吗?
节目输出
should be int
I'm a bool 1
should be bool
I'm a bool 1
should also be bool
I'm a int 1
来源
class Overload
{
public:
void checkIt(bool n) { printf(" I'm a bool %d\n", n); }
void checkit(long n) { printf(" I'm a long %ld\n", n); }
void checkit(int n ) { printf(" I'm a int %d\n", n); }
};
int main(int argc, char *argv[])
{
Overload obj;
int i = 10;
bool b = true;
printf("should be int\n");
obj.checkIt(i);
printf("should be bool\n");
obj.checkIt(b);
printf("should also be bool\n");
obj.checkit( (i == 10) );
}
修改
咄!抱歉打字错误。
但是,在修复拼写错误并注释掉bool方法之后,使用bool谓词调用int方法。如果找不到更合适的签名,是否有从bool到int的默认转换?严格来说,没有bool
签名,所以我期待编译或运行时错误......
更新代码
class Overload
{
public:
//void checkIt(bool n) { printf(" I'm a bool %d\n", n); }
void checkIt(long n) { printf(" I'm a long %ld\n", n); }
void checkIt(int n ) { printf(" I'm a int %d\n", n); }
};
int main(int argc, char *argv[])
{
Overload obj;
int i = 10;
bool b = true;
printf("should be int\n");
obj.checkIt(i);
printf("should be bool\n");
obj.checkIt(b);
printf("should also be bool\n");
obj.checkIt( (i == 10) );
}
更新输出
should be int
I'm a int 10
should be bool
I'm a int 1
should also be bool
I'm a int 1
答案 0 :(得分:3)
checkIt
并未超载;只有bool
个版本。
checkit
超载;那里有long
和int
版本。
您的代码调用checkIt
两次,checkit
调用一次。
答案 1 :(得分:0)
请记住,C ++中的函数名称(以及几乎所有其他函数)都是CaSe SeNsItIvE
在更新后的代码中,有两种checkIt
方法,一种用于int
类型,另一种用于long
类型。您调用checkIt
3次,最后2次调用方法bool
。在C ++中bool
值会自动转换为int
true == 1
和false == 0
bool a = 1 // equals to true
bool b = 0 // equals to false
由于没有方法接受' bool'类型,该值会自动转换为int
并调用int
方法。
答案 2 :(得分:0)
是C ++使用隐式conversion.bool,char自动转换为int / short / long,反之亦然。