c++ - 复制构造函数的奇怪行为

标签 c++

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

The copy constructor is a special kind of constructor which creates a new object which is a copy of an existing one, and does it efficiently.

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

 #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 的拷贝。请澄清

最佳答案

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

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

你的版本告诉编译器——“当你制作拷贝时,打印出那个东西”,它确实这样做了。您永远不会指示它复制任何成员。

仅供引用,如果您不提供任何实现,编译器将为您生成一个复制构造函数,它会执行一个浅表的成员复制。

关于c++ - 复制构造函数的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17074160/

相关文章:

c++ - 如何使用函数指针定义多重集?

c++ - C++ 中的段错误很可能在 strtok 操作中

C++ 大数溢出检测(unsigned long long)

c++ - 如何 "invalidate"一个像STL迭代器的对象

c++ - C的 "extern"是怎么工作的?

c++ - MinGW 从模板调用模板

c++ - 获取 H.264 视频的解码器 MFT

Android AIML 机器人?

c++ - 使用 C++ 进行复制省略和运算符重载

c++ - 循环 cv::Mat 对象时 cv::Exception 在内存位置