【问题标题】:How to figure out if it's a cast or a constructor call如何确定它是强制转换还是构造函数调用
【发布时间】:2013-05-11 17:47:46
【问题描述】:

以此为例:

const Integer operator+(const Integer& left, const Integer& right) {
  return Integer(left.i + right.i); 
}

(取自 Thinking in C++ 第 496 页)

return 语句之后的部分是什么? cast(使总和的结果成为Integer)还是调用class Integer构造函数?或者也许是我忽略的其他东西..

这是构造函数:

Integer(long ll = 0) : i(ll) {}

编辑:

ilong int

【问题讨论】:

  • 称为显式类型转换(函数式表示法)。这种表示法可以表示构造函数调用、对用户定义的类型转换运算符的调用或内置转换,具体取决于源类型和目标类型。在您的情况下,这是一个构造函数调用。
  • 你可以随时通过在里面添加输出语句来查看构造函数是否被使用。

标签: c++ syntax syntactic-sugar


【解决方案1】:

强制转换意味着“将一种数据类型的实体更改为另一种数据类型”。也就是说,您可以将Integer() 视为从longInteger 的转换,因为这两种类型是相关的并且操作转换为“构建B 类型的对象,从A 类型的对象开始".

使用这种语法,没有防止误用的保护,即如果构造函数只接受一个参数,则该参数可能不会用于构建直接表示第一个参数的对象(例如,每个QWidget 都有一个指向父级的指针,但它显然不代表它的父级),你不能做任何事情来阻止这种情况。您可以通过将单参数构造函数标记为explicit 来阻止隐式初始化,但仅此而已。

旧式强制转换和只有一个参数的构造函数的语法完全相同,这就是为第一个创建新语法的原因:使用新样式(显式) 类型转换的 C++ 语法,即 const_castdynamic_caststatic_castreinterpret_cast(视情况而定)。

very words of Bjarne Stroustrup 中,引入了这种冗长的强制转换语法以明确何时进行强制转换。请注意,具有四种形式还可以适当区分程序员的意图。

最后,int() 等被认为是普通类型(intlong 等)的旧式,而newvar = (T)oldvar 形式的存在只是因为 C 兼容性限制。

【讨论】:

  • "int() 等被认为是老式的" — 不是。
  • @n.m.你应该开始用事实来支持你的陈述。以下是 Stefanos 的一些声明:stackoverflow.com/questions/1609163/…
  • @stefan:type(value) 不是 C 风格的演员表。 (type)value 是。链接的声明只谈论 C 风格的演员表,我只谈论另一种。是否有其他支持它的尝试?
  • @n.m.你是对的,我很抱歉,我显然没有仔细阅读。不过,您可以先说出您不同意该陈述的原因,而不仅仅是写“不”。
  • 是的,我正要写关于我对答案所做的澄清。我认为这很清楚,因为我在第一部分中讨论了对象到对象和 pod 到对象。无论如何,this 是一个反例:第一次转换(可能会导致错误)发生,而第二次触发错误。
【解决方案2】:

它是constructor call

在 C++ 中创建对象有两种方式,

Integer* i = new Integer(args); //A Pointer i , pointing to the object created at a memory location.

Integer i = Integer(args); //Object i

您的情况是第二个,但初始化的对象没有分配给 i。而是按原样传递。

此外, 如果是(DataType) value,则演员表可能是微不足道的,在这种情况下肯定是演员表。

但是在DataType(value)的情况下,如果它是一个原始类型,它会是一个强制转换,但如果它是一个非原始类型,它肯定会是一个构造函数调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2012-06-28
    • 2016-11-19
    • 2018-01-12
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多