具有动态分配数组的类的C ++复制构造函数

use*_*920 1 c++ arrays copy-constructor dynamic-allocation

刚开始使用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();
};
Run Code Online (Sandbox Code Playgroud)

_arr是指向int数组的指针,当使用复制构造函数创建新实例时,我会在堆上创建一个新的int数组(我认为)。在复制构造函数中:

Array::Array( const Array & obj )
{
    _arr = new int[_size];

    for(int i=0;i<_size;i++)
        *_arr[i] = *obj._arr[i];
}
Run Code Online (Sandbox Code Playgroud)

我要做的第一件事是为新数组分配内存(_size是原始类型,因此据我所知会自动复制)。我想做的下一件事是使用循环复制数组本身。该部分无法通过编译说非法间接。我不确定为什么...

Who*_*aig 5

这个:

Array::Array( const Array & obj )
{
    _arr = new int[_size];

    for(int i=0;i<_size;i++)
        *_arr[i] = *obj._arr[i];
}
Run Code Online (Sandbox Code Playgroud)

可能是这样的:

Array::Array( const Array & obj )
    : _arr(obj._size ? new int[obj._size] : nullptr)
    , _size(obj._size)
{
    if (_arr)
        std::copy(obj._arr, obj._arr+_size, _arr);
}
Run Code Online (Sandbox Code Playgroud)

具体来说,请注意初始化列表的使用。其他值得一提的事情:

  1. 请勿在标识符前加上下划线。除了使代码变得难以阅读之外,您还可以使用实现保留的标识符来快速找到自己。这里不是这种情况,但是我愿意打赌这不是故意的。

  2. 您还需要一个赋值运算符来满足“三法则”。值得庆幸的是,一个体面的拷贝构造函数使它变得微不足道。

  3. 不要做任何事情。这就是为什么在设计决策中会费尽周折,咬牙切齿的原因,选择了多年的全能C ++标准委员会来祝福我们std::vector<>。如果您这样做是为了学习,那就好。您最终将学到的是,一旦接受了标准库及其所有有罪恶的乐趣,您几乎不需要这样做。

如果这是作为学习练习而进行的,则表示荣誉,并乐于忽略上面的(3)。对于(2),您可以使用已经有了一个合理的copy-ctor copy / swap惯用语了:

Array& Array::operator =(Array obj) // value-param intentional
{
    std::swap(_arr, obj._arr);
    std::swap(_size, obj._size);
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

祝你好运。