我正在读我的期中考试.有一个关于动态设置数组的问题,可能还有复制构造函数,析构函数和重载赋值运算符.你可以验证我是否正确.另外我不明白赋值运算符的重载是什么意思.你能帮我解决这个问题吗?
class A
{
int* myArray; //basically I created a pointer called myArray,
A() //are my copy constructors correct? A(), and A(int size)?
{
myArray = 0;
}
A(int size)
{
myArray = new int[size];
}
~A() // I think my destructor is correct
{
delete [] myArray;
}
Run Code Online (Sandbox Code Playgroud)
你能查一下我的代码吗?另外我如何重载赋值运算符?
提前致谢.
您已正确定义了2个重载的构造函数和析构函数.
但是,您尚未正确定义显式复制构造函数.
通常,编译器会为您生成一个,这称为隐式复制构造函数.
在您的特定情况下,自动生成的隐式复制构造函数的问题在于它只会执行myArray的浅表副本,它会共享相同的指针值但尚未为myArray分配自己的内存部分.
这意味着如果您删除原始对象中的myArray,它将影响很可能不是您想要的副本.
定义这样的显式复制构造函数将有助于:
A(const A& copy)
: _size(copy.size), myArray(new int[copy.size])
{
// #include <algorithm> for std::copy
std::copy(copy.data, copy.data + copy.size, data);
}
Run Code Online (Sandbox Code Playgroud)
(来源:复制自维基百科)
如果像这样定义复制构造函数,则不需要重载赋值运算符.如果创建新对象并将其分配给您创建的第一个对象,则将成功创建第一个对象的独立副本.
编辑:从这篇文章:
复制赋值运算符与复制构造函数的不同之处在于它必须清除赋值目标的数据成员(并正确处理自赋值),而复制构造函数将值分配给未初始化的数据成员.
复制构造函数用于基于另一个相同类型的实例创建对象.你没有这样的.您可以使用以下代码定义它:
A(const A &other)
{
myArray = new int[other._size];
_size = other._size;
memcpy(myArray, other.myArray, sizeof(int) * _size);
}
Run Code Online (Sandbox Code Playgroud)
您应该更改您的类,因此它将存储数组的_size,您还需要将构造函数和析构函数的可见性更改为public.
重载的赋值运算符应如下所示:
const A &operator=(const A &other)
{
if(this == &other) return *this; // handling of self assignment, thanks for your advice, arul.
delete[] myArray; // freeing previously used memory
myArray = new int[other._size];
_size = other._size;
memcpy(myArray, other.myArray, sizeof(int) * _size);
return *this;
}
Run Code Online (Sandbox Code Playgroud)
您还可以在此赋值运算符中添加数组大小相等的检查,这样您就可以重用动态数组而无需不必要的内存重新分配.
| 归档时间: |
|
| 查看次数: |
39463 次 |
| 最近记录: |