如何理解 C++ 中的深拷贝和浅拷贝?

2022-12-19 0 526

我不一致同意红色的隐喻:

不过实际上是这个当今世界上多半都是农夫,主要包括程式结构设计的人,C++等,因此预设的犯罪行为都是浅复本,只好有时你须要做两个刻苦的人,让事做恰当,自己去顺利完成深复本所须要的事。

我认为这种说明可能会弄成许多误会。实际上,简而言之的「浅复本」和「深复本」各别代表者相同的象征意义,各略有需。关键性是要区分值语词(value semantics)和提及语词(reference semantics)。

对值语词的第一类,在 x = y 顺利完成拷贝后,y 的状况发生改变无法影响到 x,这优点称作分立性(independence)。采用深复本的形式能全然拷贝两个分立于原本的第一类。C++ 提供更多的(模版)类绝大部分都是值语意的,如

std::basic_string

std::vector

等。

很多第一类会提及全然相同的第一类,举个格斗游戏中的范例。一般来说数个数学模型能提及同两个织物,拷贝数学模型时并无法广度拷贝新这份织物。如果须要发生改变部分模型的织物里的模块,才会全自动把该数学模型的织物拷贝,分立于其它数学模型的织物。

下面所讲的只不过不是 C++ 独有的难题。Java、C# 等词汇在结构设计两个类的这时候都要考虑到这些语词。而C++较为麻烦事的地方性,就是不支持废弃物拆解,须要处置开发周期难题。

对提及语词,在 C++ 中除能用原初操作符,还能采用如

std::shared_ptr

std::weak_ptr

等智能化操作符来表示提及,这种便能更随心所欲地采用提及语词。比如红色的范例可改成:

struct X { int x; int y; std::shared_ptr<int> p; };

这里假设 p 是用提及语词,X b = a 浅复本后,a.p 和 b.p 是提及同两个 int 变量。

我重申,值语词和提及语词是两种相同的需求。操作符成员变量也不一定代表者是提及语词,比如 vector 里的缓冲区便是以操作符储存,但 vector 是值语词的。

C++等……预设的犯罪行为都是浅复本」的原因之一,是深复本不一定能实现。比如,指向的第一类可能是多态的(C++没有标准的虚构造函数),也可能是数组,也可能有循环提及(如 struct N { N* p; };)。因此只能留待成员变量的类来决定怎样实现拷贝。

值得一提的是,除拷贝操作,还能考虑移动和交换操作。它们的性能一般来说比拷贝操作更优。自C++11 开始也提供更多了标准的移动操作实现方法。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务