龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

C++对象复制相关应用方式浅析

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
C++ 编程语言的应用范围非常广泛,而且功能很强大,它能够支持很多程序设计风格。其中就包括对面向对象的支持。在这里我们将会为大家详细介绍一下有关C++对象复制的应用方式,以

C++编程语言的应用范围非常广泛,而且功能很强大,它能够支持很多程序设计风格。其中就包括对面向对象的支持。在这里我们将会为大家详细介绍一下有关C++对象复制的应用方式,以帮助大家学习。

C++对象复制代码示例:

  1. class Table{  
  2. Name * p;  
  3. size_t sz;  
  4. publish:  
  5. Table(size_t s = 15){p = new Name[ssz=s];}  
  6. ~Table(){delete[]p ;}  
  7. ......  
  8. }  
  9. void h()  
  10. {  
  11. Table t1;  
  12. Table t2 = t1;  
  13. Table t3;  
  14. t3 = t2;  

在h()结束时,默认构造函数调用了2次,而析构函数被调用了3次,为何?

Table t1; 调用1次默认构造函数

Table t2 = t1;默认的对象的赋值操作,按成员赋值,其中关于指针p,仅仅是将t1.p赋值给t2.p,即t2.p = t1.p,并无内存分配。对象t1和t2的p指针均指向同一块内存。

Table t3; 调用1次默认构造函数

t3 = t2; 原t3.p指针被t2.p覆盖,此时t3.p同样指向对象t1和t2的p指针的同一块内存。注意:t3原分配给p的内存由于没有指针指向,无法利用,造成存储浪费。

h()结束,对象t1,t2,t3的析构函数调用,此时对t1,t2,t3的指针p所指的同一块存储进行了三次删除,非常危险,导致的结果是无发预料的,很可能灾难性的。

因此明确定义类的复制构造函数(拷贝构造函数)和赋值预算可避免这样的错误。

代码

  1. Table::Table (const Table &t)  
  2. {  
  3. p = new Name[sz=t.sz];  
  4. for(int i=0;i<sz;i++) p[i]=t.p[i];  
  5. }  
  6. Table & Table::operator=(const Table &t)  
  7. {  
  8. if(this!=&t){  
  9. delete []p;  
  10. p = new Name[sz=t.sz];  
  11. for(int i=0;i<sz;i++) p[i]=t.p[i];  
  12. }  
  13. return *this;  

C++对象复制的基本概念就为大家介绍到这里。

精彩图集

赞助商链接