调用c++中不存在的构造函数
Calling unexisting constructor in C++
假设我们有一个类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
的任何值都可以用更大的整型表示,如int
或unsigned int
。通常'3'也不转换为3。在ASCII中,字符'3'的值为48,以此类推,任何使用ASCII的系统(大多数系统)都得到这个值。
char
到指针类型的隐式转换。int
构造函数是唯一可行的选项,因此选择了它。
字符x
将被转换为整数120,如图所示。此外,回想一下,没有从类型到指针的转换,也没有从一种类型的指针到另一种类型的指针之间的转换,如果您考虑指针算术是如何工作的,这一点是显而易见的。
您不能将类型转换为指针,因为这需要分配内存,并且您必须对编译器显式执行此操作(它不会自动执行)
所以,基本上编译器正在将char
转换为int
,因为这是它唯一能做的。如果函数调用有歧义,编译器应该会报错(但这可能取决于编译器,我不确定)。
- g++ 说函数不存在,即使包含正确的标头
- 无论如何,我可以确定构造函数是否存在吗?
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++ - 空模板类构造函数不初始化值
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 为什么复制构造函数不需要检查输入对象是否指向自身?
- 为什么继承的受保护构造函数不能公开?
- 为什么原始卷曲构造函数 {} 不返回右值?
- 为什么std::atomic的默认构造函数不默认初始化底层存储值
- C++/Win32 构造函数不使用从对话框获取的字符串初始化变量
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- 基于构造函数的存在禁用代码
- 子类化 STL 容器:范围构造函数不起作用
- 带有此指针的模板类多重继承构造函数不起作用?
- C++默认复制构造函数不可行
- 构造函数不会将使用 new 初始化的数组作为参数
- 按值将对象传递给 SubClass 构造函数,导致超类的构造函数不调用
- 为什么 std::map 的移动构造函数不是 noexcept?
- 复制构造函数的存在会导致函数通过引用而不是值返回