1
const ClassA& curShot = vec_shots[curShotIndx];

在上面的代码中,curShot 对象是在同一步骤中构造和分配的。我的问题是上述语句中使用了哪个构造函数。我认为它将是默认构造函数,后跟赋值运算符,但它似乎调用了复制构造函数。为什么会这样?

4

4 回答 4

4

发生的事情是

vec_shots[curShotIndx];

返回您分配给 的引用const ClassA& curShot。此步骤不涉及对象创建。因此没有调用构造函数(既不是默认构造函数也不是复制构造函数)。

也不会调用赋值运算符,因为您没有将一个对象实例分配给另一个,而只是一个引用。您在此代码中处理的不是多个(现有)对象实例。因此,不会调用任何构造或赋值。

于 2012-12-06T06:33:07.820 回答
1

没有使用构造函数,curShot是一个引用,一个已经存在的对象的别名,而不是一个独立的对象本身。

此外,初始化和赋值不能在同一步骤完成。例如,假设你有

 ClassA original;
 ClassA copy = original;

在这里,copy没有赋值original,它是使用初始化的original。这称为复制初始化。

如果你做了

 ClassA copy2(original);

这将被称为直接初始化。

在这两种情况下都会调用复制构造函数。(可能会发生复制省略,所以它可能不会被调用,但它必须是可用的)

赋值是当你operator =在一个已经存在的对象上使用时:

 ClassA x;
 ClassA y;
 x = y;     //assignment
于 2012-12-06T06:33:14.877 回答
1

既然你写了“它似乎调用了复制构造函数”,我认为你问题中的 & 是一个错字
在那种情况下,如果你愿意

const ClassA curShot = vec_shots[curShotIndx];

它被评估为复制构造。它和丑陋的一样const ClassA curShot( vec_shots[curShotIndx] )

但是,如果你写

ClassA curShot;  // I skipped the "const", because otherwise the example would be invalid.
curShot = vec_shots[curShotIndx]; 

然后调用默认构造函数并opearator=在第二行调用 an 。


此外,“=”这么多可能意味着调用 NEITHER 复制构造函数 NOR operator=,你可以拥有这个:

const ClassA f(){ return ClassA(); }
//...
const ClassA curShot = f();  // we would expect here a copy constructor call

这里——如果编译器使用返回值优化并且通常它会这样做——只有一个默认构造函数被调用用于curShot。

于 2012-12-06T06:37:55.920 回答
0

该语句只是将 curShot 定义为引用,它不是一个新对象。

于 2012-12-06T06:33:34.877 回答