1

看下面两种方式来新建一个Y类的对象:

(1)

X x;
Y y(x);//explicit conversion

(2)

X x;
Y y = x;//implicit conversion

第一种方法使用显式转换,另一种使用隐式转换。但是,我不太了解它们是如何工作的。它们有什么区别?有人可以为我解释一下吗?越详细越好。非常感谢。

4

2 回答 2

1

第一个称为直接初始化,第二个称为复制初始化。假设Y有一个接受 a X(或引用它)的构造函数,直接初始化将直接调用该构造函数,而不管构造函数是否被标记为隐式复制初始化在语义上等价于:

Y y( implicit_conversion<Y>(x) );

也就是说,参数通过隐式转换为目标类型进行转换,然后调用复制构造函数来初始化变量。在现实生活中,编译器将删除副本并转换目标变量,但编译器必须检查是否存在从to的隐式转换,并且复制构造函数是可访问的。XY

于 2012-04-04T02:42:32.290 回答
0

实际上,假设您的类“Y”具有如下构造函数,则两者都是隐式转换:

public:
  Y(X &x)

具有单个参数的类构造函数将为您执行转换。

为避免隐式构造,请使用以下其中一种(根据您的情况,一种可能更适合您):

  • 不要用单个参数声明构造函数
  • 在构造函数声明中使用explicit关键字
  • 使用中间类(换句话说,只允许'Y'由'Z'初始化,一个永远不会直接分配给'Y'的类)
  • 使用静态成员函数使用“X”显式“制作”一个“Y”的实例(因为该成员函数与该类的实例无关
于 2012-04-04T02:14:09.663 回答