使用 Copy 构造函数复制 double 数组

copying array of double using copy constructor

提问人:Aayush Neupane 提问时间:11/24/2019 更新时间:11/24/2019 访问量:735

问:

我想为我的类制作复制构造函数,该类具有 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];

        }
}

我怎样才能使这个复制构造函数工作?

C++ 数组复制 构造函数

评论

0赞 The Philomath 11/24/2019
“为什么我不能使用 ArrayName 作为指针?”因为两个不等价
0赞 WhozCraig 11/24/2019
“为什么我不能使用 ArrayName 作为指针” - 因为数组不是指针;他们只是表现得像在特定情况下一样(这些都不适用于你正在做的事情)。
2赞 n. m. could be an AI 11/24/2019
你不需要 ,你根本不需要复制构造函数。编译器生成的复制构造函数可以很好地工作。new
1赞 Ted Lyngmo 11/24/2019
旁注:您在一种情况下使用,在另一种情况下使用。为什么不在这两种情况下都使用后者呢?*(dp+i)dp[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

虽然你不需要一个,因为编译器生成一个在这种情况下是完全可以的,但你是否需要使用或为此。memmovestd::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::copymemmovestd::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];

}