以此为例:
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
。
答案 0 :(得分:4)
投射意味着“将一种数据类型的实体更改为另一种数据”。也就是说,您可以将Integer()
视为从long
到Integer
的强制转换,因为这两种类型是相关的,并且操作转换为“构建B类型的对象,开始使用类型为“。
使用这种语法,没有防止滥用的保护,即如果构造函数只接受一个参数,则该参数可能不会用于构建直接表示第一个参数的对象(例如,每个QWidget
都会获取指向父,但显然不代表其父母,并且你不能做任何事情来防止这种情况。您可以通过将单参数构造函数标记为explicit
来阻止隐式初始化,但仅此而已。
只有一个参数的旧式强制类型转换器和构造函数的语法完全相同,这就是为第一个创建新语法的原因:使用新样式(显式) )演员表的C ++语法,即const_cast
,dynamic_cast
,static_cast
或reinterpret_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)
的情况下,如果它是一个基本类型,它将是一个强制类型,但如果它是一个非基本类型,它肯定会是一个构造函数调用。