在C ++中调用不存在的构造函数

时间:2013-04-05 13:57:17

标签: c++ type-conversion

假设我们有一个类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的指针然后使用第二个构造函数?

3 个答案:

答案 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的任何值都可以用更大的整数类型表示,例如intunsigned int。通常,'3'也不会转换为3。在ASCII中,字符“3”的值为48,因此任何使用ASCII(大多数都是)的系统都是你得到的值。

未使用指针构造函数,因为C ++不允许从char到指针类型的隐式转换。 int构造函数是唯一可行的选项,因此它被选中。

答案 2 :(得分:1)

字符x将转换为整数120,如您所见here。 另外,回想一下,没有从类型到指针的转换,或者一种类型的指针与指向另一种类型的指针之间的转换,如果您认为指针算法如何工作,这是显而易见的。

你不能将type转换为指针因为这需要分配内存,你必须对编译器明确这样做(它不会自动执行)

所以,基本上编译器正在将char转换为int,因为它是唯一能够做到的。如果函数调用不明确,编译器应该抱怨(但它可能取决于编译器,我不确定)。