假设我们有一个类String:
class String {
public:
String (int n);
String(const char *p);
}
如果我们尝试会发生什么:
String mystring='x';
Here编写的是char'x'将转换为int并将调用String(int)构造函数。但是,我不明白。
首先,'x'如何转换为int?我可以想象"3"
将被转换为3
但是“x”将被转换为什么?其次,我们在课堂上有两个构造函数。第一个构造函数接受一个int类型的参数,另一个构造函数接受一个指向char变量的指针作为参数。现在我们尝试调用不存在将char作为参数的构造函数。所以,我们将char转换为整数,但为什么我们不尝试将char转换为指向char的指针然后使用第二个构造函数?
答案 0 :(得分:9)
首先,'x'如何转换为int?我可以想象“3”将转换为3,但“x”将被转换为什么?
不要误以为是'x'
和"x"
混淆。
"x"
是一个字符串文字,你是对的,尝试将其转换为int
无意义; 'x'
是一个字符字面值,它基本上已经是一个数字(等于基本来源中字符x
所映射到的字符串的基础值字符集;对于ASCII,这是120
);将此转换为整数是微不足道的。所以,我们将char转换为整数,但为什么我们不尝试将char转换为指向char的指针然后使用第二个构造函数?
C ++中有一些规则可以控制哪个是“最佳匹配”。在这种情况下,它是int
重载。在两者都是相等匹配的情况下,您的编译器将出现“模糊过载”错误,您将被迫按顺序转换'x'
(即手动,使用强制转换)指示你想要的东西。
在你的情况下,这不是问题,因为非指针实际上不能转换为指针。
答案 1 :(得分:4)
char
是一个整数类型,char
的任何值都可以用更大的整数类型表示,例如int
或unsigned int
。通常,'3'也不会转换为3。在ASCII中,字符“3”的值为48,因此任何使用ASCII(大多数都是)的系统都是你得到的值。
未使用指针构造函数,因为C ++不允许从char
到指针类型的隐式转换。 int
构造函数是唯一可行的选项,因此它被选中。
答案 2 :(得分:1)
字符x
将转换为整数120,如您所见here。
另外,回想一下,没有从类型到指针的转换,或者一种类型的指针与指向另一种类型的指针之间的转换,如果您认为指针算法如何工作,这是显而易见的。
你不能将type转换为指针因为这需要分配内存,你必须对编译器明确这样做(它不会自动执行)。
所以,基本上编译器正在将char
转换为int
,因为它是唯一能够做到的。如果函数调用不明确,编译器应该抱怨(但它可能取决于编译器,我不确定)。