在深拷贝构造函数中,最后一行是如何实现的?
下面看到的代码取自 https://www.iditect.com/guide/cplusplus/cpp-deep-shallow-copy.html。我的困惑源自这一行。
*data = source.data;
现在,在这17篇文章中的一些里,我看到了
data = new int(*source.data).
不过,在其他一些文章中,我看到的是
*data = new int(*source.data);
显然,第一种写法是int pointer = RHS(动态内存),而第二种写法是对解引用后的int指针进行赋值,即 *pointer = RHS(动态内存)。它们不可能都对。那么,哪一个才是正确的?我怀疑第二种才是正确的,因为你是在把旧对象的数据转移到新对象的数据中。请帮我澄清一下。
#include <iostream>
class DeepCopy {
public:
int *data;
DeepCopy(int value) {
data = new int;
*data = value;
}
// Deep copy constructor
DeepCopy(const DeepCopy& source) {
data = new int;
*data = *source.data;
}
~DeepCopy() {
delete data;
}
};
int main() {
DeepCopy obj1(10);
DeepCopy obj2(obj1); // Deep copy
std::cout << "Object 1 value: " << *obj1.data << std::endl;
std::cout << "Object 2 value: " << *obj2.data << std::endl;
// Modify obj2
*obj2.data = 20;
std::cout << "After modifying obj2" << std::endl;
std::cout << "Object 1 value: " << *obj1.data << std::endl;
std::cout << "Object 2 value: " << *obj2.data << std::endl;
return 0;
}
解决方案
data = new int;
*data = *source.data;
这会分配一个未初始化的int,然后对其写入值。这没问题。
data = new int(*source.data);
这会分配一个int,并将其初始化为所需的值。这样做更好。
DeepCopy(const DeepCopy& source) : data(new int(*source.data)) {}
这与第二种做法相同,只是在初始化列表中完成。这对构造函数来说是最佳选择。
*data = new int(*source.data);
这不应该编译通过。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。