我有家庭作业问题
这些方法后v包含什么?为什么?如果方法无效,请解释原因。
template <typename T> void reset1(MathVector<T> v) {v[0] = 0;}
template <typename T> void reset2(MathVector<T> &v) {v[0] = 0;}
template <typename T> void reset3(const MathVector<T> &v) {v[0] = 0;}
我之前的经验告诉我,第一个会保持向量不变,因为它不是通过值传递而是通过复制传递,第二个会被正确更改,第三个将无效,因为参数指定了const。
但是我很确定c ++数组总是按值传递,因为它不会自动调用复制构造函数或任何东西。我怀疑它可能也适用于载体,但我不太确定。因此,如果是这种情况,第一个会改变向量而第二个会无效,因为你试图对矢量指针进行操作没有意义吗?我在这里不太确定
答案 0 :(得分:1)
template <typename T> void reset1(MathVector<T> v) {v[0] = 0;}
这会传递矢量按值,因此对矢量v
的任何修改都只是局部的,一旦函数完成,原始矢量就会保持不变。
template <typename T> void reset2(MathVector<T> &v) {v[0] = 0;}
这会通过引用传递 ,因此更改第一个元素实际上是修改原始矢量。这里第一个元素将被更改为0。
template <typename T> void reset3(const MathVector<T> &v) {v[0] = 0;}
此处,矢量也通过引用传递,但它是const
。这意味着您可能不会尝试修改向量,它至少应该产生编译器警告。