【发布时间】:2018-01-06 16:25:09
【问题描述】:
Vector类的复制赋值和移动赋值代码如下:
//Copy assignment
Vector& Vector::operator = (const Vector& other)
{
double* p = new double[other.size];
copy(other.elem,other.elem + other.size,elem);
delete[] elem;
elem = p;
size = other.size;
return *this
}
这是我对复制分配的理解:
double* p = new double[other.size];
- 表示我们为新向量分配新空间
copy(other.elem,other.elem + other.size,elem);
-我们将other向量的所有元素(从第一个元素other.elem到最后一个元素other.elem + other.size)复制到空间p?
delete[] elem;
-我们释放旧空间,因为我们将用新空间替换它
elem = p;
size = other.size;
return *this
- 我们用新参数替换参数并返回它们
我的理解正确吗?
我不明白(或者至少现在我的大脑无法接受),如果我们释放旧空间,为什么可以为其分配新元素?
【问题讨论】:
-
关于
copy调用,你的理解是错误的。你看到p在通话中的任何地方使用了吗? -
我还建议您查看this canonical implementation of the copy-assignment operator。请密切注意该函数中的第一条语句(
if)。由于你做事的顺序,你绕过了这个问题,但如果你将对象分配给它自己,你仍然可以做你不必做的操作。 -
@Someprogrammerdude 用于分配 elem = p
-
是的,但您不会从另一个复制到
p。你复制到elem。如果this->sz < other.sz,这可能会导致一些大问题。 -
@Someprogrammerdude 这段代码实际上来自使用 c++ Stroustrup 的编程原理和实践。正如你所理解的,我不明白。如果有时间,能否一步步解释每一行的意思?
标签: c++