方法问题 - 什么改变了价值,什么不改变?什么无效?

时间:2014-10-27 12:06:54

标签: c++ templates methods vector const

我有家庭作业问题

这些方法后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 ++数组总是按值传递,因为它不会自动调用复制构造函数或任何东西。我怀疑它可能也适用于载体,但我不太确定。因此,如果是这种情况,第一个会改变向量而第二个会无效,因为你试图对矢量指针进行操作没有意义吗?我在这里不太确定

1 个答案:

答案 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 。这意味着您可能不会尝试修改向量,它至少应该产生编译器警告。