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次,为何?#t#

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++对象复制的基本概念就为大家介绍到这里。

责任编辑:曹凯 来源: 博客园
相关推荐

2010-02-06 17:39:52

C++ strtok

2010-01-25 14:18:46

C++对象模型

2010-01-14 14:17:20

Visual C++

2010-02-02 17:39:31

C++构造函数

2010-02-03 14:30:04

C++栈对象

2010-02-05 16:46:58

C++ TinyXml

2009-08-25 15:15:08

C#对象序列化应用

2010-02-06 16:39:45

C++ assert(

2010-02-04 13:39:44

C++数组参数

2010-02-06 16:21:35

C++常规DLL

2010-02-03 15:27:26

C++ static

2010-02-04 14:29:45

C++ typenam

2010-01-21 09:34:57

C++语法

2010-01-27 16:05:06

C++堆栈

2010-02-03 10:11:17

C++动态数组

2010-02-01 17:31:06

C++类成员

2010-01-22 13:59:34

Visual C++应

2010-02-05 13:44:06

C++ eof()函数

2010-01-27 17:16:52

C++构造函数

2010-01-20 10:19:55

C++数组
点赞
收藏

51CTO技术栈公众号