C++の深いコピー実現


   
#include<iostream>
#include<stdio.h>
using namespace std;
class String
{
public :
     String(char* str="")
         : _str(new char [strlen(str )+1])
    {
          strcpy(_str , str);
    }
	 String(const String& s)//    
		 :_str(NULL)
	 {
	    String tmp(s._str );
		swap(_str,tmp._str );
	 }
     String& operator =(const String& s )
    {
   		
		swap(_str,s._str );
        return *this;
    }
    ~ String()
    {
		if(_str)
		{
		    delete[] _str ;
		}
    }
private :
     char* _str ;
}
void test1 ()
{
     String s1("s1");
     String s2(s1);
	
	 String s3("s3");
	 String s4(s3);
	 s1=s4;
}
int main()
{
	test1();
	system("pause");
    return 0;
}
       
#include<iostream>
#include<stdio.h>
using namespace std;
class String
{
public :
     String(char* str="")
         : _str(new char [strlen(str )+1])
		 ,_pCount(new int(1))
    {
          strcpy(_str , str);
    }
	 String( String& s)
		 :_str(s._str )
		 ,_pCount(s._pCount)
	 {
	     ++(*_pCount);
	 }
     String& operator =(const String& s )
    {
   		if(--(*_pCount)==0)
		{
		    delete _pCount;
			delete[] _str;
		}
		_str=s._str ;
		_pCount=s._pCount ;
		++(*_pCount);
        return *this;
    }
    ~ String()
    {
          if (--(*_pCount)==0&&_str )
         {
			  delete _pCount;
              delete[] _str ;
         }
    }
private :
     char* _str ;
	 int* _pCount;
};
void testcount ()
{
     String s1("s1");
     String s2(s1);
	 String s3(s2);
	 String s4("s4");
	 String s5 (s4);
	 s1=s4;
}
int main()
{
	testcount();
	system("pause");
    return 0;
}