C++中的默认函数 深拷贝与浅拷贝 深赋值与浅赋值
1、C++中什么都不写,就有6个默认函数,由系统自动提供:
构造函数,拷贝构造函数,赋值语句,析构函数,对一般对象的取地址符,对常对象的取地址重载;
对&运算符的重载:
Test t3;
Test *pt = &t3;
Test*operator&(){returnthis;}
对常对象的取地址重载;
const Test t4;
const Test *pt1 = &t4;
constTest*operator&()const{returnthis;}
2、深拷贝与浅拷贝
#include<iostream>#include<string.h>#include<malloc.h>usingnamespacestd;classString{public:String(constchar*str=""){if(str==NULL){data=newchar;data[0]=0;}else{data=newchar[strlen(str)+1];strcpy(data,str);}}~String(){delete[]data;}private:char*data;};intmain(void){Stringt1("abcdef");Stringt2=t1;Stringt3("hello");t3=t1;return0;}
运行结构如下:
可以知道,程序崩了,我们用的是系统默认的拷贝构造函数和赋值语句,此时只是各成员之间的赋值,
两个对象通过默认的拷贝构造,成员data之间相互赋值,使得data不同,data的值相同,指向了同一空间;
此时在最后调用析构函数时,形成了对同一空间的多次释放,是错误操作!!!,这就是浅拷贝。
两个对象通过默认的赋值语句,成员data之间相互赋值,使得data不同,data的值相同,指向了同一空间,浅赋值。
解决方案,此时应给自己写拷贝构造和赋值语句,达成深拷贝:
String(constString&s){data=newchar[strlen(s.data)+1];strcpy(data,s.data);}String&operator=(constString&s){if(this!=&s){delete[]data;data=newchar[strlen(s.data)+1];strcpy(data,s.data);}return*this;}
深拷贝和深赋值的意思:就是重新申请空间,各自保存自己的,最后在自己释放自己的,保证了对内存访问的安全性;
深赋值应当注意以下四步:
(1)、判断自己是否给自己赋值
(2)、释放原有空间 //有可能在构造对象时,已经指向了某一空间,此时就得先释放,不然就内存泄漏
(3)、申请空间进行赋值
(4)、返回引用空间
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。