C ++显式转换和隐式转换

时间:2012-04-04 01:56:20

标签: c++ oop class

请看以下两种创建Y类新对象的方法:

(1)

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

(2)

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

public:
  Y(X &x)

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

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

  • 不要使用单个参数声明构造函数
  • 在构造函数声明
  • 上使用explicit关键字
  • 使用中间类(换句话说,只允许'Y'由'Z'初始化,'Z'是一个永远不会直接分配给'Y'的类)
  • 使用静态成员函数使用'X'显式'make''Y'的实例(因为成员函数与类的实例没有关联