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;
}
时间: 2024-08-04 00:39:42

C++的深拷贝实现的相关文章

【转载】C++拷贝构造函数(深拷贝,浅拷贝)

对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CExample {private:     int a;public:     CExample(int b)     { a=b;}     void Show ()     {        cout<

Java 浅拷贝和深拷贝

一看就懂的,java深拷贝浅拷贝 将一个对象的引用复制给另外一个对象,一共有三种方式.第一种方式是直接赋值,第二种方式是浅拷贝,第三种是深拷贝.所以大家知道了哈,这三种概念实际上都是为了拷贝对象啊. 1.直接赋值 好,下面我们先看第一种方式,直接赋值.在Java中,A a1 = a2,我们需要理解的是这实际上复制的是引用,也就是说a1和a2指向的是同一个对象.因此,当a1变化的时候,a2里面的成员变量也会跟着变化.各位,请看下面的代码吧! /* 建立类 */ class Resume { pri

Java 深拷贝浅拷贝 与 序列化

一.浅拷贝.深拷贝 浅拷贝会对对象中的成员变量进行拷贝:如果是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是内存地址 : 深拷贝,除了基本类型外,引用类型所引用的对象也会进行拷贝:(引用的对象只要求浅拷贝即可:若要深层拷贝,一般可利用序列化和反序列化来实现,也可手动实现各级引用对象的深层拷贝:) 二.实现: 浅拷贝:实现Cloneable接口,重写clone()方法,在clone()调用父类super.clone()即可: 深拷贝:1. 实现Cloneable接口,

关于对象数组的深拷贝的一种绝佳方法

目前在百度上搜索了好多关于对象深拷贝的问题. 发现有的说 1, Objec.assign() 2,  Array.slice(0) 3, [].concat(data) 发现都没有达到深层拷贝的目的, 但有一种方法可以实现深层拷贝 NewData = JSON.parse(JSON.stringify(Olddata)) 这个就是会吧原来的数据转化为字符串,这是针对对象的所有引用关系就不复存在了,然后再转化回来就是一个全新的对象.不在出现新对象改动污染原始对象的问题了!!

Java clone()深拷贝、浅拷贝

Cloneable接口是一个空接口,仅用于标记对象,Cloneable接口里面是没有clone()方法,的clone()方法是Object类里面的方法!默认实现是一个Native方法 protected native Object clone() throws CloneNotSupportedException; 如果对象implement Cloneable接口的话,需要覆盖clone方法(因为Object类的clone方法是protected,需要覆盖为public) public Obj

java的深拷贝和浅拷贝

import java.util.*; import java.io.*; class User implements Serializable{ public String name; public int age; public User(String str,int num){ name=str; age=num; } public String toString(){ return "Name:"+name+"\n"+"Age:"+age

使用DataContractSerializer类实现深拷贝操作

1 实现深拷贝方法 using System.IO; using System.Runtime.Serialization; namespace DeepCopyExp { class DeepCopy { public static T DeepCopyByDCS<T>(T obj) { T newObject; using (MemoryStream memoryStream = new MemoryStream()) { DataContractSerializer dcs = new

完全理解python深拷贝和浅拷贝

import copya = [1, 2, 3, 4, ['a', 'b']]  #原始对象b = a  #赋值,传对象的引用c = copy.copy(a)  #对象拷贝,浅拷贝d = copy.deepcopy(a)  #对象拷贝,深拷贝a.append(5)  #修改对象aa[4].append('c')  #修改对象a中的['a', 'b']数组对象print 'a = ', aprint 'b = ', bprint 'c = ', cprint 'd = ', d 输出结果:a = 

javaScript之深拷贝与浅拷贝

js中有两种数据类型: 1.  基本类型  :  Number.String.Boolean.Null.Undefined 2.  复杂类型  :  Object .Array 深拷贝和浅拷贝只针对复杂类型的数据,因为基本类型数据的定义都会重新开辟新的内存. 浅拷贝拷贝的是内存地址,只是增加一个指针指向已有的内存,这时多个数据共用一个内存空间:深拷贝是新增了指针并且新开辟了内存空间,新指针指向新的内存. 浅拷贝: var a={ name:'WangJing', sex:'女', age:'25

流畅的python学习笔记第八章:深拷贝,浅拷贝,可变参数

首先来看赋值,浅拷贝,深拷贝. 一赋值: a=['word',2,3] b=a print id(a),id(b) print [id(x) for x in a] print [id(x) for x in b] a[0]='hello' print a print b E:\python2.7.11\python.exe E:/py_prj/fluent_python/chapter8.py 24709080 24709080 [24410496, 21298404, 21298392] [