使用复制构造函数复制双精度数组

copying array of double using copy constructor

本文关键字:复制 数组 双精度 构造函数      更新时间:2023-10-16

我想为我的类制作复制构造函数,该类具有双精度数组作为私有成员\ 如何编写复制构造函数,我尝试过以下代码,但会导致错误

class My_class
{
private:
double dp [500];
public:
My_class(const My_class & c1)
{
//error the following line why i cant use arrayname as a pointer?
dp =new double[500];
for(int i=0;i<500;i++)
*(dp+i)=c1.dp[i];
}
}

如何使此复制构造函数工作?

dp =new double[500];

该代码是冗余和错误的。因为您已经有一个成员dp作为双精度数组。

删除该行,您的构造函数应该可以工作:

for(int i=0;i<500;++i)
*(dp+i)=c1.dp[i];

但这也是多余的。因为你的类有一个数组成员(不是指针(,所以默认的复制构造函数将为你完成所有工作(即成员复制(。

通常,当您拥有指针成员时,您只需要担心复制构造函数(和复制赋值等( - 在这种情况下,默认(编译器生成的(复制构造函数将执行不正确的所谓浅拷贝,因此您必须创建自己的深拷贝,或者更好地使用称为移动操作的东西。

虽然你不需要一个,因为编译器生成的编译器在这种情况下是完全可以的,但如果需要,你可以为此使用memmovestd::copy

double array[500];
double dest[500];
std::copy(begin(array), end(array), begin(dest));
::memmove(dest, array, sizeof(double)*500);

您将 dp 数组声明为成员变量,因此无需使用 new 运算符分配其内存,只需直接使用数组即可

My_class(const My_class & c1)
{
//error the following line why i cant use arrayname as a pointer?
//dp =new double[500]; << no need to do this
for(int i=0;i<500;i++)
dp[i]=c1.dp[i];

}