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

Nik*_*iko 11 c++

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

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

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

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

Mik*_*our 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
Run Code Online (Sandbox Code Playgroud)

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

  • @Niko:通过`const`引用返回,而不是通过值,允许您读取数组而无需复制它的成本,只有在需要修改它时才复制它. (2认同)