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

C++ 调用C+中不存在的构造函数+;,c++,type-conversion,C++,Type Conversion,假设我们有一个类字符串: class String { public: String (int n); String(const char *p); } 如果我们尝试: String mystring='x'; 已写入,字符“x”将转换为int,并将调用字符串(int)构造函数。不过,我不明白 首先,如何将“x”转换为int?我可以想象,“3”将转换为3,但“x”将转换为什么?第二,类中有两个构造函数。第一个构造函数接受一个int类型的参数,另一个构造函数接受指向char

假设我们有一个类字符串:

class String {
   public: 
   String (int n);
   String(const char *p);
}
如果我们尝试:

String mystring='x';
已写入,字符“x”将转换为int,并将调用字符串(int)构造函数。不过,我不明白

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

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

不要犯混淆
'x'
“x”
的错误

  • “x”
    是一个字符串文字,您是对的,尝试将其转换为
    int
    是没有意义的
  • 'x'
    是一个字符文字,基本上已经是一个数字(等于基本源字符集中字符
    x
    映射到的任何字符的基础值;对于ASCII,这是
    120
    );将其转换为整数非常简单
所以,我们将char转换为整数,但为什么不尝试将char转换为指向char的指针,然后使用第二个构造函数呢

C++中有规则来规定哪个是“最佳匹配”。在这种情况下,它是
int
重载。如果两者都是相等的匹配,编译器将出现“不明确重载”错误,并且您将被迫显式地转换
'x'
(即手动转换),以便指定您想要的


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

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


不使用指针构造函数,因为C++不允许从<代码> char < /C> >隐式转换为指针类型。

int
构造函数是唯一可行的选项,因此被选中。

字符
x
将转换为整数120,如您所见。 另外,请记住,没有从类型到指针的转换,也没有从一种类型的指针到另一种类型的指针的转换,如果您考虑一下指针算法的工作原理,这一点是显而易见的

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


因此,基本上编译器正在将
char
转换为
int
,因为这是它唯一能做的。如果函数调用不明确(编译器可能依赖编译器,我不确定),编译器应该抱怨。“我可以想象<代码> 3”<代码>将转换为<代码> 3代码>代码>——你可以想象,但你错了。”RogerLipscombe:他指的是C++,可能有一种直观的方法可以在抽象级别转换此类数据。@RogerLipscombe:(例如,JavaScript和PHP都能够以人类直观的方式进行这种转换。)@LightnessRacesinOrbit:是的。我知道。+1当你说“x”是一个数字时,你可能想提到它是什么数字(它是120)。我学习了整数、实数和复数。我也知道四元数,但我从不到处乱跑
字符文字
数字。。。如何与他们合作?“x”+2的结果是什么?@dasblinkenlight:不一定!可能是,;也可能不太可能。@Roman:取决于使用的字符集。对于ASCII,
x
120
,因此
'x'+2
的结果是
122
。试试看@Lightness在轨道上运行,这是否意味着如果我在第一个构造函数前面放置
explicit
关键字,然后尝试
String mystring='x',我将收到一条错误消息。(1)ASCII不保证(2) 
无法将类型转换为指针,因为这需要分配内存
;创建指针不需要创建指针对象。