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?
你是怎么分配的?你试图赋予它什么价值?由于 rhs
是 const&
(应该是!),您 不能 分配给它的成员——这将导致 compile-time 错误,不在分段错误中。其实rhs
的大小是函数前置条件的一部分。不得对其进行修改(因此使用 const&
)。
这里还有一些函数的错误:
- 不防self-assignment(如果
this == &rhs
怎么办?)
- 它不会释放
ptr
中的 previously-allocated 内存。
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?
你是怎么分配的?你试图赋予它什么价值?由于 rhs
是 const&
(应该是!),您 不能 分配给它的成员——这将导致 compile-time 错误,不在分段错误中。其实rhs
的大小是函数前置条件的一部分。不得对其进行修改(因此使用 const&
)。
这里还有一些函数的错误:
- 不防self-assignment(如果
this == &rhs
怎么办?) - 它不会释放
ptr
中的 previously-allocated 内存。