当构造函数只有一个参数并且据说它对类类型进行了隐式强制转换时,会很好地澄清究竟发生了什么 - 就在那里它让我感到困惑,因为:
class dog {
public :
dog(string name) { mname = name;}
private :
string mname;
};
我不明白如何将类型字符串转换为类型狗,我可以看到如何传入它并设置另一个字符串,但如果字符串转换为类型dog,那甚至意味着什么?是不是类型狗被分配了一个明智的字符串副本?
答案 0 :(得分:1)
如果你有:
x/y
这是做什么的,因为漫威者看到你打电话给#include <iostream>
#include <string>
class dog {
public:
dog(std::string name) : mname(name) {} // use initializer list
private:
std::string mname;
};
void Foo(dog g) {}
int main()
{
std::string name = "fido";
Foo(name);
}
,但我们给它Foo()
而不是给它dog
。所以编译器去了#34;好吧,我有什么方法可以用字符串制作一只狗吗?让我们看看string
构造函数。哦,看,我可以从dog
构建一个dog
。我会继续从您传递给string
的{{1}}开始dog
,一切都会好的。&#34;
这就是所谓的隐式类型转换。我们可以通过将构造函数标记为string
来防止这种情况发生。使构造函数Foo()
将其从隐式转换中删除
explicit
现在编译器经历了相同的步骤但它不能使用构造函数,因此您将收到编译器错误。现在,如果我们想要转换,我们手动必须这样做:
explicit