用户定义的类(c ++)是否有默认的显式转换函数?

时间:2013-07-03 10:16:36

标签: c++ class casting explicit

我是否可以在不实际定义强制转换运算符的情况下转换兼容的非指针对象?所以,如果B继承自A:

A a;
B b;

如果我不提供自己的演员操作员,(A)b会编译吗?

编辑:似乎编译。是因为存在默认的转换转换运算符,或者编译器是否识别兼容性并在分配中使用默认的复制构造函数或赋值运算符?

2 个答案:

答案 0 :(得分:3)

是的,它确实编译(http://ideone.com/CXbeh0

默认情况下A是可复制的。复制构造函数具有签名A::A(A const &)。由于B的实例可隐式转换为A const &,因此将使用A的复制构造函数解析转换。

转换为引用也适用于(也是隐式生成的)复制赋值运算符,因此a = b再次使用A &A::operator=(A const &)进行编译。

请记住,新对象是A类型而不是B类,因此它不包含B的原始实例所做的任何其他信息。这很少是你想要的。

在旁注中,建议在C ++中忘记存在C风格的强制类型并使用更具体的C ++强制转换类型:

  • 使用匹配构造函数创建临时目标类型的显式请求的函数样式转换;还允许使用多参数构造函数。
  • static_cast,仅适用于兼容类型。
  • dynamic_cast用于上传指针/带有运行时的引用 检查。
  • const_cast仅处理const。
  • reinterpret_cast如果你真的需要玩指针技巧,但要注意别名规则。

答案 1 :(得分:0)

如果没有定义用户定义的构造函数或运算符,则:

(A)b

将按以下方式实施:

A(b) //Calls A copy-constructor: A::A(const A&)

也就是说,它将从参数创建一个临时的复制构造。

这称为对象拼接,这通常是一个坏主意,因为您正在复制B的某些字段,而不是其他字段。 YMMV。