我对C ++很陌生,所以这可能是一个微不足道的问题:
我的类有一个私有成员变量,它是一个数组。我需要返回该数组,但我不确定如何正确地执行此操作。
class X {
// ...
private: double m_Array[9];
public: double* GetArray() const { return m_Array; }
};
此代码有问题吗?这会返回一个指向类成员的指针,对吗? - 所以如果我从这个类的一个实例中获取该数组并修改它(从类外部),原始的类成员数组也将被更改?如果是这种情况,我该如何返回数组的副本?
答案 0 :(得分:11)
这会返回一个指向类成员的指针,对吗?
几乎 - 它返回一个指向数组第一个元素的指针。
如果我从这个类的实例中获取该数组并修改它(从类外部),原始的类成员数组也将被更改?
这是正确的。
如果是这种情况,我该如何返回数组副本?
实现这一目标的最简单方法是使用std::array
或std::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复制数组的元素。