1

我是 C++ 编程的新手,和其他人一样,我发现复制构造函数的概念有点奇怪。我浏览了一个网站,上面说

复制构造函数是一种特殊的构造函数,它创建一个新对象,该对象是现有对象的副本,并且有效地执行此操作。

我写了一个代码来创建一个对象,它是另一个对象的副本,发现结果很奇怪,代码如下。

 #include <iostream>

 using namespace std;

 class box
 {
   public:

   double getwidth();
   box(double );
   ~box();
    box(box &);
   private:
      double width;
 };

box::box(double w)
{
   cout<<"\n I'm inside the constructor ";
   width=w;
}

box::box(box & a)
{
  cout<<"\n Copy constructructor got activated ";
}
box::~box()
{
  cout<<"\n I'm inside the desstructor ";

}

double box::getwidth()
{
   return width;
}


int main()
{
  box box1(10);
  box box2(box1);
  cout<<"\n calling getwidth from first object  : " <<box1.getwidth();
  cout<<"\n calling the getwidth from second object   : " <<box2.getwidth(); 
}

当我按照下面的代码调用 box2.getwidth() 时,我得到了一个垃圾值。根据我的理解,我希望将宽度初始化为 10,因为 box2 是 box1 的副本。请澄清

4

2 回答 2

9

您的期望是所有成员都被自动复制,但它们不是(如果您提供自己的实现,则不会)。您需要自己添加逻辑:

box::box(const box & a)
{
  width = a.width;
  cout<<"\n Copy constructructor got activated ";
}

您的版本告诉编译器 - “无论何时制作副本,打印出那个东西”,它确实如此。您永远不会指示它复制任何成员。

仅供参考,如果您没有提供实现,编译器将为您生成一个复制构造函数,它会执行浅层的成员复制。

于 2013-06-12T19:58:03.050 回答
2

像这样写你的副本ctor。您的复制构造函数代码不会复制对象内容。

box::box(box & a):width(a.width)
{
  cout<<"\n Copy constructructor got activated ";
}
int main()
{
box a(10);

box b = a;//copy constructor is called
return 0;
}
于 2013-06-12T20:03:26.543 回答