如果类内部涉及到动态内存分配,通常情况下需要实施深拷贝

    如果要共享内存要另当别论,如果要共享内存,最后一个对象销毁的时候才调用析构函数,只析构一次。
 
    系统提供的默认拷贝函数实施的是浅拷贝
 
    深拷贝,是自己定义的拷贝构造函数决定如何复制。
    
    浅拷贝就是位拷贝,如果类有个指针成员,只复制指针,并不复制指针所指向的内存
 
    如果实行位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。
    
    如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。
 
 下面用代码示例进行说明:
String.h
 
 
  
  1. //String.h 
  2.  
  3. # ifndef _STRING_H_ 
  4. # define _STRING_H_ 
  5.  
  6. class String 
  7. public
  8.     String(char* str = " "); 
  9.     ~String(); 
  10.  
  11.     String(const String& other); 
  12.  
  13.     String& operator = (const String& other); 
  14.  
  15.     void Display(); 
  16.  
  17. private
  18.     char* AllocAndCopy(char* str); 
  19.     char* str_; 
  20.     //如果类内部涉及到动态内存分配 
  21.     //通常情况下需要实施深拷贝 
  22.     //如果要共享内存要另当别论 
  23.     //如果要共享内存,最后一个对象销毁的时候才 
  24.     //调用析构函数,只析构一次 
  25.  
  26.  
  27. }; 
  28. # endif // 
 String.cpp
 
 
  
  1. //String.cpp 
  2.  
  3. # include "String.h" 
  4. //# include <string.h> 
  5. # include <cstring> 
  6. # include <iostream> 
  7. using namespace std; 
  8.  
  9. //实施浅拷贝,系统默认的构造函数 
  10. String::String(char* str) 
  11.     /*int len = strlen(str) + 1; 
  12.     str_ = new char[len]; 
  13.     memset(str_,0,len); 
  14.     strcpy(str_, str);*/ 
  15.     //以上由AllocAndCopy(str_);代替 
  16.     str_ = AllocAndCopy(str);//此为浅拷贝 
  17.  
  18. //实施深拷贝 
  19. String::String(const String& other) 
  20.     /*int len = strlen(other.str_)+1; 
  21.     str_ = new char[len]; 
  22.     memset(str_,0,len); 
  23.     strcpy(str_, other.str_);*/ 
  24.  
  25.     //以上由AllocAndCopy(char *  str_);代替 
  26.     str_ = AllocAndCopy(other.str_); //此为深拷贝 
  27.  
  28. char* String::AllocAndCopy(char* str) 
  29.     int len = strlen(str) + 1; 
  30.     char * tmp = new char[len]; 
  31.     memset(tmp, 0,len); 
  32.     strcpy(tmp, str); 
  33.          
  34.     return tmp; 
  35.  
  36.  
  37. String& String::operator=(const String &other) 
  38.     if(this == &other) 
  39.     { 
  40.         return *this
  41.     } 
  42.     //首先要销毁空间,因为它原来就存在了 
  43.     delete[] str_; 
  44.     str_ = AllocAndCopy(other.str_); 
  45.      
  46.     return *this
  47. String::~String() 
  48.     delete[] str_; 
  49.  
  50. void String::Display() 
  51.     cout << "Str = " << str_  << endl; 
 main.cpp
 
 
  
  1. # include "String.h" 
  2.  
  3. int main(void
  4.     String s1("AAA"); 
  5.     //String s2("BBB"); 
  6.  
  7.     s1.Display(); 
  8.     String s2 = s1;//调用默认的拷贝构造函数,如果有深拷贝调用深拷贝,如果没有深拷贝,则在运行时出错 
  9.                   //系统提供的默认拷贝函数实施的是浅拷贝 
  10.     //等价s2.str_ = s1.str_ ; 指向同一块内存,没有分配自己的内存 
  11.     //当两个对象生成周期结束的时候,被释放了两个同一个内存空间 
  12.     //提供一个自己的拷贝函数 
  13.     s2.Display(); 
  14.  
  15.     String s3; 
  16.     s3.Display(); 
  17.     //s3 = s2; error 本质原因调用了等号运算符, 
  18.     //系统提供的默认=运算符实施的也是浅拷贝 
  19.     //s3.str_ = s2.str; 逐个会员赋值 
  20.     //s3 = s2; 
  21.     //s3.operator = (s2); 
  22.  
  23.     return 0;    
  24. // 
  25. //赋值操作,=运算符的重载 
  26.  
  27.  
  28. //独一无二的对象禁止拷贝 
 
 运行结果: