在同一步骤中构造一个新对象和赋值

时间:2012-12-06 06:32:03

标签: c++

const ClassA& curShot = vec_shots[curShotIndx];

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

4 个答案:

答案 0 :(得分:4)

会发生什么

vec_shots[curShotIndx];

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

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

答案 1 :(得分:1)

没有使用构造函数,curShot是引用,是现有对象的别名,而不是独立的对象。

此外,无法在同一步骤完成初始化和分配。例如,假设你有

 ClassA original;
 ClassA copy = original;

此处copy未分配original,使用original初始化 ClassA copy2(original); 。这称为复制初始化。

如果你做了

operator =

这将被称为直接初始化。

将在两个实例中调用复制构造函数。 (copy elision可能会发生,因此可能无法调用,但必须可用)

分配是指在现有对象上使用 ClassA x; ClassA y; x = y; //assignment 时:

{{1}}

答案 2 :(得分: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=


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

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

这里 - 如果编译器使用返回值优化并且通常会这样做 - 只为curShot调用默认构造函数。

答案 3 :(得分:0)

这句话只是将curShot定义为参考,它不是一个新对象。