c – 成员复制,按位复制,浅拷贝和深拷贝有什么区别?
我搜索了这些条款,但我仍然感到困惑.
有些人说成员副本是深拷贝,而按位副本是影子副本,但有人说它不是. 任何人都可以向我解释默认复制构造函数和用户定义的复制构造函数使用哪种类型的副本? 解决方法
会员明智的副本
当您访问每个成员并显式复制它时,调用其复制构造函数.这通常等于深层复制.这是复制事物的正确方法.相反的是逐位复制,这是一个黑客,见下文. 按位复制 是浅拷贝的特定形式.只需使用memcpy()或类似的方法将源类的位复制到目标类.构造函数没有被调用,所以你倾向于得到一个似乎没事的类,但是一旦你开始使用它,事情就会以可怕的方式开始.这与成员副本相反,并且是一种快速而肮脏的黑客,当我们知道没有要调用的构造函数并且没有内部结构可以复制时,有时可以使用它.有关此问题可能出错的讨论,请参阅此问答:A:C++ bitwise vs memberwise copying? 浅拷贝 指仅复制对象的直接成员,而不复制它们指向的任何结构.这是你做一个按位复制时得到的. (请注意,没有“影子副本”这样的东西.我的意思是,在文件系统中有这样的东西,但这可能不是你想到的那样.) 深拷贝 不仅指复制对象的直接成员,还要复制它们指向的任何结构.这是您在进行成员复制时通常会得到的. 总结一下: 有两类: >浅拷贝 然后,有两种广泛使用的技术: >按位复制(一种浅拷贝形式) 至于听说 – 有人说某事和某人说了别的话:比特复制肯定是浅拷贝.会员明智的副本通常是深层复制,但你当然可以搞砸,所以你可能会认为你正在制作一份很深的副本,而事实上你并非如此.正确的成员复制依赖于具有适当的复制构造函数. 最后: 如果已知对象可以轻易复制,则默认复制构造函数将执行逐位复制,否则将执行成员复制.但是,编译器并不总是有足够的信息来执行每个成员的正确副本.例如,通过制作指针的副本来复制指针,而不是通过制作指向对象的副本.这就是为什么当对象不可轻易复制时,通常不应该依赖编译器为您提供默认的复制构造函数. 用户提供的构造函数可以执行用户喜欢的任何类型的副本.希望用户能够明智地选择并做成员明智的副本. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |