【发布时间】:2014-06-15 08:45:41
【问题描述】:
刚开始接触 C++(现在几天),我有 C 背景。
我有一个类,它主要包含一个指向 int 数组的指针,代码如下:
class Array
{
private:
int * _arr;
int _size;
public:
Array();
Array(int size);
Array(const Array& obj); // copy constructor
~Array();
void readInValues();
void mult(int num);
void add(int num);
void printArray();
};
_arr 是一个指向 int 数组的指针,当使用复制构造函数创建一个新实例时,我会在堆上创建一个新的 int 数组(我认为)。在复制构造函数中:
Array::Array( const Array & obj )
{
_arr = new int[_size];
for(int i=0;i<_size;i++)
*_arr[i] = *obj._arr[i];
}
我要做的第一件事是为新数组分配内存(_size 是一种原始类型,因此据我所知会自动复制)。我想做的下一件事是使用循环复制数组本身。这部分编译失败,说非法间接。我不知道为什么......
【问题讨论】:
-
不,
_size未被复制。你必须自己做。然后,你的循环应该有_arr[i] = obj._arr[i];,但你也可以使用std::copy。您还需要对赋值运算符做一些事情。 -
当您以 C 为背景使用 C++ 时,您需要做的第一件事是完全忘记数组和指针。为了兼容性,C++ 从 C 继承了这些东西。除非您需要与 C 或旧 C++ 代码交互,否则切勿使用它们。在您从词汇表中消除这些概念之前,不要继续讨论其他主题。请改用
std::vector、std::shared_ptr和std::unique_ptr。 -
@n.m.我认为这更像是一个练习,因为我怀疑任何人仍然会在 C++ 中实现一个数组,因为它是由标准库提供的。从这个角度来看,很好地理解指针和内存管理实际上非常重要,并且会对您有所帮助。此外,原始指针可以在小规模上表现得更好,并且并非毫无意义,因为它们可以指示所有权中的不同事物:stackoverflow.com/questions/7657718/…
-
请注意,您还需要一个赋值运算符,可能还需要一个移动构造函数/移动赋值运算符。见三/五法则。
标签: c++ arrays copy-constructor dynamic-allocation