【问题标题】:Method questions - What changes the value and what doesn't? What's invalid?方法问题 - 什么改变了价值,什么没有?什么是无效的?
【发布时间】:2014-12-22 14:39:54
【问题描述】:

我有作业问题

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

【问题讨论】:

  • "数组总是按值传递" - 它们不是,但这与这里无关,因为您正在传递一个类类型。
  • 编译一组测试用例,一探究竟。实验是在一个小桶中对两只以上的小鸡进行。

标签: c++ templates methods vector constants


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

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 2018-12-06
    • 2012-11-17
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    相关资源
    最近更新 更多