1

以此为例:

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

(取自 Thinking in C++ 的第 496 页)语句

后面的部分是什么return?强制转换(使总和的结果为Integer)或调用?的构造函数 class Integer或者也许是我忽略的其他东西。

这是构造函数:

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

编辑:

i它是long int

4

2 回答 2

4

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

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

旧式强制转换和只有一个参数的构造函数的语法完全相同,这就是为第一个创建新语法的原因:使用新式(显式)C++ 语法进行强制转换,即const_cast,或as合适的。dynamic_caststatic_castreinterpret_cast

Bjarne Stroustrup 的话来说,引入这种冗长的转换语法是为了明确何时进行转换。请注意,具有四种形式还可以适当区分程序员的意图。

最后,对于普通类型( ,等),int()这些被认为是旧式的,并且仅由于 C 兼容性约束而存在表单。intlongnewvar = (T)oldvar

于 2013-05-11T17:55:33.180 回答
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.,则 A 演员表可能是微不足道的,在这种情况下,它肯定是演员表。

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

于 2013-05-11T17:59:02.240 回答