如何在C ++中正确返回数组(类成员)?

时间:2012-04-10 11:04:40

标签: c++

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

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

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

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

3 个答案:

答案 0 :(得分:11)

  

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

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

  

如果我从这个类的实例中获取该数组并修改它(从类外部),原始的类成员数组也将被更改?

这是正确的。

  

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

实现这一目标的最简单方法是使用std::arraystd::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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

是的,当您更改阵列时,您还将更改班级成员。

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

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

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