11

我对 C++ 很陌生,所以这可能是一个微不足道的问题:

我的类有一个私有成员变量,它是一个数组。我需要返回该数组,但我不确定如何正确执行此操作。

class X {
    // ...
    private: double m_Array[9];
    public: double* GetArray() const { return m_Array; }
};

这段代码有问题吗?这会返回一个指向类成员的指针,对吧?- 所以如果我从这个类的一个实例中获取该数组并修改它(从类外部),原来的类成员数组也会被改变?如果是这种情况,我该如何返回数组的副本呢?

4

3 回答 3

11

这会返回一个指向类成员的指针,对吧?

几乎 - 它返回一个指向数组第一个元素的指针。

如果我从此类的实例中获取该数组并修改它(从类外部),那么原始类成员数组也会被更改吗?

这是正确的。

如果是这种情况,我该如何返回数组的副本呢?

实现这一目标的最简单方法是使用std::arrayorstd::vector代替。您应该返回const对它的引用 - 然后调用者在不需要时避免复制成本。例子:

class X {
    std::array<double, 9> array;
public:
    std::array<double, 9> const & GetArray() const {return array;}
};

X x;
double d = x.GetArray()[5]; // read-only access, no copy

auto array = x.GetArray();  // get a copy
array[5] = 42;              // modify the copy

或者,如果数组具有固定大小(如您的示例中那样),您可以返回包含在结构中的数组 - 这就是std::array。否则,您可以将指针(最好是智能指针,以避免内存泄漏)返回到新分配的数组 - 这或多或少是什么std::vector

于 2012-04-10T11:08:48.250 回答
2

为了返回一个new数组的副本,double需要动态分配,填充当前值m_Array并返回给调用者(具体来说是指向第一个元素的指针)。调用者将负责delete[]返回的数组。就目前而言,调用者不知道返回数组中的元素数量。

由于这是 C++,建议改为 a std::vector<double>:这将为您处理复制并为调用者提供有关 s 数量的信息double

于 2012-04-10T11:09:58.137 回答
2

是的,当您更改数组时,您也会更改类成员。

我建议您在 c++ 中使用 std::vector 而不是 c 样式的数组。它将使您的生活更轻松,并使代码更易于阅读。如果你还有理由坚持使用数组,你需要分配一个新的数组并返回一个指向它的指针。请注意,这将迫使您处理动态内存并注意释放它:

public:
  double* GetArray() {
    double* res = new double[9];
    for (int i = 0; i < 9; ++i) {
      res[i] = m_Array[i];
    }
    return res;
  }

您还可以使用 memcpy 复制数组的元素。

于 2012-04-10T11:10:34.737 回答