C++中赋值运算符重载错误

Error in assignment operator overloading in C++

class Array
{
private:
    int *ptr;
    int size;
    
public:
    Array& operator = (const Array& rhs);
};

Array& Array::operator = (const Array& rhs)
{
    ptr = new int [rhs.size];
    size = rhs.size;
    
    for( int i = 0; i < size; i++ )
        ptr[i] = rhs.ptr[i];
        
    return *this;
}

int main()
{
    Array a;
    Array b;    
        
    a = b;
}

这段代码有什么问题?

我可以观察到的第一件事是 size 的值尚未定义。所以会报错。

size 是私有的,所以我不能从 main 给它赋值,但这是赋值运算符的参数。我在哪里赋值?

我试图在 = 运算符的定义中分配 rhs.size 的值,但随后它引发了分段错误。为什么?

我不明白他们打算用这个 for 循环做什么:

for( int i = 0; i < size; i++ )
        ptr[i] = rhs.ptr[i];

我想了解这段代码发生了什么。

没有构造函数就无法首先分配内存进行复制,无法分配 size,等等。您需要添加该功能来测试您的复制功能。

我在这里勾画了更多代码以使其更具操作性,但显然还有很多工作要做:

#include <iostream>

class Array
{
private:
    int *ptr;
    int size;
    
public:
    // Simple default constructor
    Array(int size = 0) : ptr(new int[size]), size(size) {
    }

    int getSize() const { return size; };

    Array& operator=(const Array& rhs);
};

Array& Array::operator=(const Array& rhs)
{
    // Delete any previous allocation
    delete[] ptr;

    ptr = new int[rhs.size];
    size = rhs.size;
    
    for( int i = 0; i < size; i++ )
        ptr[i] = rhs.ptr[i];
        
    return *this;
}

int main()
{
    Array a(5);
    Array b;

    std::cout << "a size=" << a.getSize() << std::endl;

    b = a;

    std::cout << "b size=" << b.getSize() << std::endl;
}

请记住它被称为 operator= 作为一个词,而不是 operator = 全部间隔开。语法无关紧要,但程序员会这样做,因为它以完全不同的方式进行视觉解析。

请注意,这与惯用的 C++ 有很长的路要走,例如使用 size_t 更适合“大小”类型的参数,但是您需要学习和学习的东西有很长很长的清单随便你。

在我们讨论 operator= 之前,我们需要认识到 class 从根本上被破坏了:它没有有效的构造函数,并且违反了 rule of three,并且因此没有正确管理其资源。

这两点都搞定了,(但实际上只有之后!),我们可以转向operator=。让我们先谈谈你的三点:

First thing I can observe is that size's value have not been defined. So there will be an error.

一旦 class 有一个可用的构造函数,size 就会有一个定义的值。

size is private so I can't assign it a value from main, yet that is a parameter of assignment operator. Where do I assign the value?

在构造函数中。

I tried to assign the value of rhs.size inside the definition of the = operator but then it threw segmentation fault. Why?

你是怎么分配的?你试图赋予它什么价值?由于 rhsconst&(应该是!),您 不能 分配给它的成员——这将导致 compile-time 错误,不在分段错误中。其实rhs的大小是函数前置条件的一部分。不得对其进行修改(因此使用 const&)。

这里还有一些函数的错误:

  1. 不防self-assignment(如果this == &rhs怎么办?)
  2. 它不会释放 ptr 中的 previously-allocated 内存。