发现类副本构造的问题

Posted

技术标签:

【中文标题】发现类副本构造的问题【英文标题】:Finding problem with class copy construction 【发布时间】:2011-03-24 00:27:30 【问题描述】:

我的一项 c++ 作业有问题。它更多的是一个理论问题。代码如下:

//a class implementation
class IntArrays 
public:
   IntArrays(int n): data(new int[n]), size(n)  
   ~IntArrays()  delete[] data; ;
   const int& operator[](int n) const
       return data[n]; 

   IntArrays(const IntArrays& ar):
      data(new int[ar.size]),
      size(ar.size) 
      std::copy(data, data + size, ar.data);
   

private:
   int* data;
   int size;
;

//a driver
int main()

    IntArrays a(100);
    IntArrays b = a;   // Problem!
      return 0;


In 1-2 sentences, explain why the second line of the driver program is problematic.

我真的不知道驱动程序第二行的错误是什么,因为当我运行它时它很好。起初我以为是因为 = 运算符没有重载,但 IntArrays b = a 使用的是复制构造函数,所以不是这样。我完全困惑,请帮助。如果我没有得到答案,这会很困扰我。

提前致谢。

【问题讨论】:

这个问题是否来自您确定准确可靠的来源?提出它的人是否有可能错误地认为IntArrays b = a; 会使用operator= 这是一道作业题,我直接从word文件中复制过来的。我之前搜索了一下,它使用 IntArrays b = a; 的复制构造函数但它是从头开始创建的。 【参考方案1】:

你抄错了。

std::copy(data, data + size, ar.data);

应该是:

std::copy(ar.data, ar.data + size, data);

【讨论】:

谢谢,我不知道他所说的第二行有什么问题是不是这个意思,因为从技术上讲,这不在第二行,但它是第二行使用的。 @Pete42:不过,它准确地模拟了现实生活 - 您第一次在程序中观察到问题的行很少是包含错误的行。或者可能只是因为如果问题是“std::copy 行中的错误是什么”,它会使分配变得太容易...... 我完全同意你的看法,非常感谢你。我们从来没有真正在类中创建自定义复制构造函数,所以我是新手。

以上是关于发现类副本构造的问题的主要内容,如果未能解决你的问题,请参考以下文章

在没有动态分配的情况下在构造时组合对象时避免数据的多个副本

继承默认构造函数,矛盾吗?

复制单链表的构造函数节点类

可克隆层次结构中的C ++副本构造函数和赋值

java源码解析之String类

矢量的独特副本