深复制和浅复制

1,默认复制构造函数可以完成对象的数据成员值简单的复制

2,对象的数据资源是由指针指向的堆时,默认复制构造函数

仅作指针值复制

两对象共享一块内存

class name

public :

name(char *pn) ;  

name( name &obj)

{

cout <<" copy Constructing " << endl ;

char *pn = obj.getPn();

pname = (char *)malloc(strlen(pn) +1);

if (pname!=NULL) strcpy(pname,pn) ;

//pname = new char[strlen(pn)+1] ;

//if (pname!=0) strcpy(pname,pn) ;

size = strlen(pn) ;

}

~ name() ;

protected : 

char *pname ;       int size ;

public:

char * getPn()

{

return pname;

}

void operator=(name &obj1)

{

cout <<" 执行=操作" << endl ;

if(pname != NULL) //很必要

{

Free(pname)

Pname =NULL;

Size = 0;

}

char *pn = obj1.getPn();

pname = (char *)malloc(strlen(pn) +1);

if (pname!=NULL) strcpy(pname,pn) ;

//pname = new char[strlen(pn)+1] ;

//if (pname!=0) strcpy(pname,pn) ;

pname[0] = 'm';

size = strlen(pn) ;

}

} ;

name::name(char *pn)

cout <<" Constructing " << pn << endl ;

pname = (char *)malloc(strlen(pn) +1);

if (pname!=0) strcpy(pname,pn) ;

//pname = new char[strlen(pn)+1] ;

//if (pname!=0) strcpy(pname,pn) ;

size = strlen(pn) ;

name :: ~ name()  //析构函数

cout << " Destructing " << pname << endl ; 

pname[0] = '\0' ;

//delete  []pname ;

free(pname);

size = 0 ;

}

 

 

void playmain()

{

name obj1("name1");

//如果你不写copy构造函数,那么C++编译器会给我们提供一个默认的copy构造函数 (浅cpy

name obj2 = obj1;

 

//如果你不写=操作,那么C++编译器会给我们提供一个=操作函数 (浅cpy

obj2 = obj1;

cout<<obj2.getPn()<<endl;

}

注意

等号操作和拷贝构造函数是两个不同概念使用拷贝构造函数时对象还没有内存空间因此不需要判断是否有旧的内存空间没释放使用等号操作时对象已经有了内存空间(初始化),因此重新赋值是应当注意判断,旧的内存空间是否释放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值