2017-10-28 145 views
0

如果一个类有一个指针,我们必须通过重载赋值操作符来创建一个深度拷贝(浅拷贝不正确)。默认Assigment运算符是否适用于向量?

那么,如果一个类有一个成员向量,是否有必要做一个深层复制(通过重载operator=)?

+0

关于术语的注意事项:您不要*重载*赋值运算符。超载有另一个含义。你在这里做的是定义你自己的赋值运算符版本,而不是依靠编译器自动生成的默认版本。 –

回答

1

std::vector可以自己照顾自己。你不需要做任何特别的事情。它有自己的赋值操作符来进行适当的复制。

+0

非常感谢。它也适用于阵列吗? – tarktark

+1

@tarktark - 它有助于[阅读手册](http://en.cppreference.com/w/cpp/container/array)(查找'operator =') – rustyx

2

如果一个类有一个指针,我们必须用分配操作符 重载(而不是浅拷贝)来做深度拷贝。

仅当该指针是所谓的“拥有”指针时,即该类语义上拥有指向的资源并负责其最终的释放或销毁。

指针也可能是一个所谓的“观察”指针,它指向代码的另一部分负责的内容。观察指针与参考相似。

请牢记这一点,然后才能盲目地在各处实施深度复制。

那么如果一个类有 成员向量,那么是否需要深拷贝(运算符=重载)呢? ?

仅当它实际上是指向矢量的指针(如果该指针是拥有指针的话)。

这实际上从来就不是这种情况。

我假设你真的在谈论一个正常的非指针成员变量反正:

class Example 
{ 
// ... 
    std::vector<int> v; 
}; 

在这种情况下,你不必在所有处理指针。 std::vector自动管理一切。