const ClassA& curShot = vec_shots[curShotIndx];
在上面的代码中,curShot 对象是在同一步骤中构造和分配的。我的问题是上述语句中使用了哪个构造函数。我认为它将是默认构造函数,后跟赋值运算符,但它似乎调用了复制构造函数。为什么会这样?
const ClassA& curShot = vec_shots[curShotIndx];
在上面的代码中,curShot 对象是在同一步骤中构造和分配的。我的问题是上述语句中使用了哪个构造函数。我认为它将是默认构造函数,后跟赋值运算符,但它似乎调用了复制构造函数。为什么会这样?
发生的事情是
vec_shots[curShotIndx];
返回您分配给 的引用const ClassA& curShot
。此步骤不涉及对象创建。因此没有调用构造函数(既不是默认构造函数也不是复制构造函数)。
也不会调用赋值运算符,因为您没有将一个对象实例分配给另一个,而只是一个引用。您在此代码中处理的不是多个(现有)对象实例。因此,不会调用任何构造或赋值。
没有使用构造函数,curShot
是一个引用,一个已经存在的对象的别名,而不是一个独立的对象本身。
此外,初始化和赋值不能在同一步骤完成。例如,假设你有
ClassA original;
ClassA copy = original;
在这里,copy
没有赋值original
,它是使用初始化的original
。这称为复制初始化。
如果你做了
ClassA copy2(original);
这将被称为直接初始化。
在这两种情况下都会调用复制构造函数。(可能会发生复制省略,所以它可能不会被调用,但它必须是可用的)
赋值是当你operator =
在一个已经存在的对象上使用时:
ClassA x;
ClassA y;
x = y; //assignment
既然你写了“它似乎调用了复制构造函数”,我认为你问题中的 & 是一个错字。
在那种情况下,如果你愿意
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。
该语句只是将 curShot 定义为引用,它不是一个新对象。