我找不到合适的标题-如果您有更好的描述,请对其进行编辑。希望有人可以帮助我了解正在发生的事情。我有以下代码,我刚刚在Linux上编译了-它可以工作。我只是不明白当我Foo
用a调用时const char*
,它是如何被(编译器?)转换为我的对象的Test
。
#include <iostream>
#include <cstring>
class Test
{
public:
Test(const char* _data = "")
{
int length = strlen(_data);
internalData = new char[length+1];
strncpy(internalData, _data, length);
internalData[length] = '\0';
}
char* internalData;
};
class Bar
{
public:
void Foo(Test _data)
{
std::cout << "Data: " << _data.internalData << std::endl;
}
};
int main(int argc, char* argv[])
{
Bar b;
b.Foo("This is my data");
}
// Output: Data: This is my data
所以,我很好奇为什么/如何工作-是编译器吗?运行?是否有文档说明为什么-有人可以提供链接?
编译器必须查找从char const*
到的有效转换Test
,因此它搜索从的构造函数Test
以转换参数。这是§12.3/ 1(强调我的)允许的标准行为:
类对象的类型转换可以由构造函数和转换函数指定。这些转换称为用户定义的转换,用于隐式类型转换(第4章),初始化(8.5)和显式类型转换(5.4、5.2.9)。
隐式转换序列创建一个临时实例,Test
然后将其复制或移动到参数中。实际上,编译器可以通过称为copy-elision的优化来消除此复制/移动。
如果要防止隐式转换,可以标记构造函数explicit
:
explicit Test(char const* = "");
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句