如何判断它是演员还是构造函数调用

时间:2013-05-11 17:47:46

标签: c++ syntax syntactic-sugar

以此为例:

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

(取自C ++中Thinking的第496页)

return声明后的部分是什么?一个强制转换(以使结果为Integer)或调用class Integer构造函数?或者也许是我忽略的其他事情。

这是构造函数:

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

编辑:

i它是long int

2 个答案:

答案 0 :(得分:4)

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

的对象

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

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

very words of Bjarne Stroustrup中,引入了这种详细的强制转换语法,以便在进行强制转换时明确。请注意,有四种形式也可以正确区分程序员的意图。

最后,对于普通类型(int()int等),long等被视为旧式,并且newvar = (T)oldvar形式仅因C兼容性约束而存在

答案 1 :(得分:0)

它是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)的情况下,如果它是一个基本类型,它将是一个强制类型,但如果它是一个非基本类型,它肯定会是一个构造函数调用。