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

Calling unexisting constructor in C++

本文关键字:构造函数 不存在 c++ 调用      更新时间:2023-10-16

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

首先,如何将'x'转换为int?我可以想象3会被转换成3那么x会被转换成什么呢?

不要混淆'x'"x"

  • "x"是一个字符串字面值,你是对的,试图将其转换为int是没有意义的;
  • 'x'是一个字符字面量,它基本上已经是一个数字(等于字符x基本源字符集中映射到的任何基础值);对于ASCII,这是120);将其转换为整数很简单。
因此,我们将char转换为整型,但为什么不尝试将char转换为指向char的指针,然后使用第二个构造函数呢?

c++中有一些规则来决定哪一个是"最佳匹配"。在本例中,它是int过载。在两者都是相等匹配的情况下,你的编译器将呈现一个"模棱两可的过载"错误,你将被迫显式地转换'x' (即手动,强制转换),以指示你想要的。

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

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

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

字符x将被转换为整数120,如图所示。此外,回想一下,没有从类型到指针的转换,也没有从一种类型的指针到另一种类型的指针之间的转换,如果您考虑指针算术是如何工作的,这一点是显而易见的。

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

所以,基本上编译器正在将char转换为int,因为这是它唯一能做的。如果函数调用有歧义,编译器应该会报错(但这可能取决于编译器,我不确定)。