看下面两种方式来新建一个Y类的对象:
(1)
X x;
Y y(x);//explicit conversion
(2)
X x;
Y y = x;//implicit conversion
第一种方法使用显式转换,另一种使用隐式转换。但是,我不太了解它们是如何工作的。它们有什么区别?有人可以为我解释一下吗?越详细越好。非常感谢。
第一个称为直接初始化,第二个称为复制初始化。假设Y
有一个接受 a X
(或引用它)的构造函数,直接初始化将直接调用该构造函数,而不管构造函数是否被标记为隐式。复制初始化在语义上等价于:
Y y( implicit_conversion<Y>(x) );
也就是说,参数通过隐式转换为目标类型进行转换,然后调用复制构造函数来初始化变量。在现实生活中,编译器将删除副本并转换目标变量,但编译器必须检查是否存在从to的隐式转换,并且复制构造函数是可访问的。X
Y
实际上,假设您的类“Y”具有如下构造函数,则两者都是隐式转换:
public:
Y(X &x)
具有单个参数的类构造函数将为您执行转换。
为避免隐式构造,请使用以下其中一种(根据您的情况,一种可能更适合您):
explicit
关键字