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'
映射到的任何字符的基础值;对于ASCII,这是x
);将其转换为整数非常简单120
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) 无法将类型转换为指针,因为这需要分配内存
;创建指针不需要创建指针对象。