0

我有以下课程

class abc
{
private:
  string name_;
public:
  explicit abc(string name);
};

class xyz
{
private:
  abc obj_abc_;
public:
  xyz ():obj_abc_("NOTHING") { }; //I think this should give an error since explicit is used.
};

根据我对显式的理解,每当调用 xyz 构造函数时,我都应该得到一个编译器错误;因为我通过简单地将obj_abc分配给一个字符串来初始化它。但我在这里没有得到任何编译器错误。我错过了什么?

4

2 回答 2

2

expliciton a constructor 意味着该构造函数不能用于从其参数类型到类类型的转换。所以一个隐式转换

abc x = "NOTHING";

如果构造函数是 将被禁止explicit,否则不会。显式转换

abc x("NOTHING");

在任何一种情况下都将被允许。在您的情况下,初始化列表中的直接初始化是明确的;因此可以使用您的显式构造函数。

explicit不会阻止对构造函数参数类型的隐式转换;因此,在任何一种情况下,都允许使用非显式构造函数从示例转换为"NOTHING"to 。stringstring

于 2014-12-12T16:09:32.550 回答
0

除了语法错误(使用{ }而不是;),您没有分配或隐式转换任何内容。您正在初始化列表中明确构造对象。

于 2014-12-12T15:57:53.780 回答