提问人:Aayush Neupane 提问时间:11/24/2019 更新时间:11/24/2019 访问量:735
使用 Copy 构造函数复制 double 数组
copying array of double using copy constructor
问:
我想为我的类制作复制构造函数,该类具有 double 数组作为私有成员\ 如何编写复制构造函数 我尝试了以下代码,但结果却出错了
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];
}
}
我怎样才能使这个复制构造函数工作?
答:
2赞
artm
11/24/2019
#1
dp =new double[500];
该代码是多余的和错误的。因为你已经有一个成员作为双精度数组。dp
删除该行,构造函数应该可以工作:
for(int i=0;i<500;++i)
*(dp+i)=c1.dp[i];
但这也是多余的。因为你的类有一个数组成员(而不是指针),所以默认的复制构造函数将为你完成所有工作(即成员复制)。
通常,当你有一个指针成员时,你只需要担心复制构造函数(和复制赋值等)——在这种情况下,默认的(编译器生成的)复制构造函数会做所谓的浅拷贝,这是不正确的,所以你必须创建自己的深拷贝,或者更好的是用一种叫做移动操作的东西。
1赞
Tanveer Badar
11/24/2019
#2
虽然你不需要一个,因为编译器生成一个在这种情况下是完全可以的,但你是否需要使用或为此。memmove
std::copy
double array[500];
double dest[500];
std::copy(begin(array), end(array), begin(dest));
::memmove(dest, array, sizeof(double)*500);
评论
0赞
Pete Becker
11/25/2019
使用任何合理的 C++ 库实现,都会在适当的时候变成调用。所以坚持.+1.std::copy
memmove
std::copy
0赞
Ahmed Anter
11/24/2019
#3
您已将 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];
}
下一个:在构造函数中复制静态数组
评论
new
*(dp+i)
dp[i]
dp[i] = c1.dp[i];