const ClassA& curShot = vec_shots[curShotIndx];
在上面的代码中,curShot对象是在同一步骤构造和分配的。我的问题是在上面的语句中使用了哪个构造函数。我认为它将是赋值运算符后面的默认构造函数,但它似乎调用了复制构造函数。为什么会这样?
答案 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定义为参考,它不是一个新对象。