3

假设我们有一个 String 类:

class String {
   public: 
   String (int n);
   String(const char *p);
}

如果我们尝试会发生什么:

String mystring='x';

这里写到 char 'x' 将被转换为 int 并调用 String(int) 构造函数。但是,我不明白。

首先,如何将'x'转换为int?我可以想象它"3"会被转换成3但是“x”会被转换成什么?其次,我们在类中有两个构造函数。第一个构造函数接受一个 int 类型的参数,另一个构造函数接受一个指向 char 变量的指针作为参数。现在我们尝试调用不存在的以 char 作为参数的构造函数。那么,我们将 char 转换为整数,但是为什么我们不尝试将 char 转换为指向 char 的指针,然后使用第二个构造函数呢?

4

3 回答 3

9

首先,如何将'x'转换为int?我可以想象“3”将转换为 3,但“x”将转换为什么?

不要犯混淆'x'和的错误"x"

  • "x"是一个字符串文字,你是对的,尝试将它转换为int;是没有意义的
  • 'x'是一个字符文字,它基本上已经是一个数字(等于基本源字符集中x字符映射到的任何底层值;对于 ASCII,这是);将其转换为整数是微不足道的。120

那么,我们将 char 转换为整数,但是为什么我们不尝试将 char 转换为指向 char 的指针,然后使用第二个构造函数呢?

C++ 中有一些规则来管理“最佳匹配”。在这种情况下,它是int过载。在两者相等匹配的情况下,您的编译器将显示“模棱两可的重载”错误,并且您将被迫'x' 显式转换(即手动,使用强制转换)以指示您想要的。

在您的情况下,这不是问题,因为非指针实际上无法转换为指针。

于 2013-04-05T13:58:37.257 回答
4

char是一个整数类型,并且 的任何值都char可以用更大的整数类型来表示,例如intunsigned int。'3' 通常也不会转换为 3。在 ASCII 中,字符“3”的值为 48,依此类推,任何使用 ASCII(大多数)的系统都是您得到的值。

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

于 2013-04-05T14:05:08.903 回答
1

字符x将转换为整数 120,如您在此处看到的。另外,回想一下,没有从类型到指针的转换,或者在一种类型的指针到另一种类型的指针之间的转换,如果您认为 bout 指针算术是如何工作的,这很明显。

您不能将类型转换为指针,因为这需要分配内存,并且您必须对编译器显式执行此操作(它不会自动执行此操作)

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

于 2013-04-05T14:05:36.737 回答