gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:17:31 26 4
gpt4 key购买 nike

刚开始学习 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com