设为首页 加入收藏

TOP

C++拷贝构造函数详解(十)
2012-12-10 12:48:45 来源: 作者: 【 】 浏览:2545
Tags:拷贝 构造 函数 详解

  当然,以上代码不用我们编写,编译器会为我们自动生成。但是如果认为这样就可以解决对象的复制问题,那就错了,让我们来考虑以下一段代码:

  [c-sharp]

  class Rect

  {

  public:

  Rect()      // 构造函数,计数器加1

  {

  count++;

  }

  ~Rect()     // 析构函数,计数器减1

  {

  count--;

  }

  static int getCount()       // 返回计数器的值

  {

  return count;

  }

  private:

  int width;

  int height;

  static int count;       // 一静态成员做为计数器

  };

  int Rect::count = 0;        // 初始化计数器

  int main()

  {

  Rect rect1;

  cout<<"The count of Rect: "<<Rect::getCount()<<endl;

  Rect rect2(rect1);   // 使用rect1复制rect2,此时应该有两个对象

  cout<<"The count of Rect: "<<Rect::getCount()<<endl;

  return 0;

  }

  这段代码对前面的类,加入了一个静态成员,目的是进行计数。在主函数中,首先创建对象rect1,输出此时的对象个数,然后使用rect1复制出对象rect2,再输出此时的对象个数,按照理解,此时应该有两个对象存在,但实际程序运行时,输出的都是1,反应出只有1个对象。此外,在销毁对象时,由于会调用销毁两个对象,类的析构函数会调用两次,此时的计数器将变为负数。

  说白了,就是拷贝构造函数没有处理静态数据成员。

  出现这些问题最根本就在于在复制对象时,计数器没有递增,我们重新编写拷贝构造函数,如下:

  [c-sharp]

  class Rect

  {

  public:

  Rect()      // 构造函数,计数器加1

  {

  count++;

  }

  Rect(const Rect& r)   // 拷贝构造函数

  {

  width = r.width;

  height = r.height;

  count++;          // 计数器加1

  }

  ~Rect()     // 析构函数,计数器减1

  {

  count--;

  }

  static int getCount()   // 返回计数器的值

  {

  return count;

  }

  private:

  int width;

  int height;

  static int count;       // 一静态成员做为计数器

  };

  2. 浅拷贝

  所谓浅拷贝,指的是在对象复制时,只对对象中的数据成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。大多情况下“浅拷贝”已经能很好地工作了,但是一旦对象存在了动态成员,那么浅拷贝就会出问题了,让我们考虑如下一段代码:

  [c-sharp]

  class Rect

  {

  public:

  Rect()      // 构造函数,p指向堆中分配的一空间

  {

  p = new int(100);

  }

  ~Rect()     // 析构函数,释放动态分配的空间

  {

  if(p != NULL)

  {

  delete p;

  }

  }

  private:

  int width;

  int height;

  int *p;     // 一指针成员

  };

  

          

首页 上一页 7 8 9 10 11 下一页 尾页 10/11/11
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++完美实现Singleton模式 下一篇C++实现链队列的基础操作

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: