gpt4 book ai didi

c++ - C++中动态数组的赋值运算符

转载 作者:行者123 更新时间:2023-12-02 10:22:58 26 4
gpt4 key购买 nike

我试图理解赋值运算符的以下两个实现版本,该版本用于将另一个动态数组分配给调用它的实例(class DoubleVector)。

版本1。

    DoubleVector& DoubleVector::operator= (DoubleVector other)
{
swap(vector_, other.vector_);
swap(size_, other.size_);

return *this;
}

版本2。
    DoubleVector& DoubleVector::operator= (const DoubleVector& other)
{
double* newVector = new double[other.size_]; // (Try to) allocate new memory

for (int i = 0; i < other.size_; i++)
{
newVector[i] = other.vector_[i];
}

delete[] vector_; // After allocation succeeded we can delete the old array

size_ = other.size_;
vector_ = newVector;

return *this;
}

我的问题是:
  • 对于版本1,是否有可能遗漏任何情况(例如other.size_ = 0)?
  • 对于版本2,为什么分配成功后需要删除旧数组(delete[] vector_;)?有必要吗?
  • 此外,对于版本2,我可以直接将other分配给调用“=”的实例吗?
    例如
    DoubleVector& DoubleVector::operator= (const DoubleVector& other)
    {
    for (int i = 0; i < other.size_; i++)
    {
    vector_[i] = other.vector_[i];
    }

    size_ = other.size_;


    return *this;
    }
  • 最佳答案

    请注意,作为参数传递给两个版本的复制操作符的数组是不同的。

    在第一种情况下,有一个按值传递的DoubleVector value参数(使用副本构造函数或副本赋值运算符创建了所传递值的副本,在此情况下如下所示)。由于出于效率考虑,函数使用数据副本操作,因此用swap替换了该副本。所有极端情况(例如other.size == 0)都将得到正确处理。

    在第二种情况下,const引用传递了一个const DoubleVector & value参数。不执行数据复制,并且为了确保不会修改外部数据,请引用const(通常,在适用时使用const限定词是一种好习惯)。在这种情况下,我们会为将来的数组手动分配内存(因为当前分配的数组(如果有)可能在大小上有所不同)。出于这个原因,也可以使用realloc。指向数组的进一步内部指针设置为新分配的数据:vector_ = newVector;。在分配之前,我们必须通过调用delete[] vector_;返回先前分配的内存。否则会发生内存泄漏。考虑使用10 ^ 6 double的数组对该操作符的10 ^ 3调用。

    第二种方法有一个问题。自我分配没有检查:

    DoubleVector& DoubleVector::operator= (const DoubleVector& other)
    {
    if (this == &other)
    return;
    ...
    }

    Copying是OOP的核心概念。有多种常用的解决方案:写时复制,引用副本,副本交换习惯用法(在注释中提到)和其他解决方案。
    另外,现代C++引入了 move概念。

    希望能帮助到你。

    关于c++ - C++中动态数组的赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59254175/

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