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

标签 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();
};

_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 是原始类型,因此据我所知会自动复制)。接下来我想做的是使用循环复制数组本身。这部分编译失败说非法间接。我不确定为什么...

最佳答案

这个:

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

    for(int i=0;i<_size;i++)
        *_arr[i] = *obj._arr[i];
}

可能是这样的:

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);
}

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

  1. 不要使用带有前导下划线的标识符。除了使代码阅读起来非常痛苦之外,您会很快发现自己正在使用由实现保留的标识符。此处并非如此,但我敢打赌这不是故意的。

  2. 您还需要一个赋值运算符来完成 Rule of Three .值得庆幸的是,一个体面的复制构造函数使这变得微不足道。

  3. 任何都不要做。这就是为什么过去几年全能的 C++ 标准委员会在设计决策中痛哭流涕、咬牙切齿地选择用 std::vector<> 来祝福我们的原因。 .如果你这样做是为了学习,那很好。您最终会了解到,一旦您接受了标准库及其带来的所有负罪感,您就很少需要这样做。

如果这是一个学习练习,恭喜,请忽略上面的 (3)。对于 (2),您可以使用 copy/swap idiom既然你有一个合理的复制者:

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

祝你好运。

关于具有动态分配数组的类的 C++ 复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24227980/

相关文章:

c++ - std::get_time - 如何检查解析错误

c++ - 在 C++ 中 Hook 调用函数?

java - 对字符串中的字符求和并打印最大的字符串(java)

ios - 如何为每个数组保存图像

c++ - 复制构造函数和 operator= 是必须的吗?

c++ - 将 ofstream 的实例插入到容器中

c++ - 在 crypto++ 中将字符串转换为字节

c++ - 当我的程序只能以 1 Mbps 速率处理数据时,如何处理 100 Mbps 输入流

c++ - 为什么在使用字符串文字初始化后无法将字符分配给字符数组?

c++ - 强制编译器选择以 const T& 作为参数的复制构造函数