C++中的默认函数深拷贝与浅拷贝深赋值与浅赋值-创新互联
1、C++中什么都不写,就有6个默认函数,由系统自动提供:
创新互联公司主营郫都网站建设的网络公司,主营网站建设方案,app软件开发公司,郫都h5小程序定制开发搭建,郫都网站营销推广欢迎郫都等地区企业咨询构造函数,拷贝构造函数,赋值语句,析构函数,对一般对象的取地址符,对常对象的取地址重载;
对&运算符的重载:
Test t3;
Test *pt = &t3;
Test* operator&(){ return this; }
对常对象的取地址重载;
const Test t4;
const Test *pt1 = &t4;
const Test* operator&()const{ return this; }
2、深拷贝与浅拷贝
#include#include #include using namespace std; class String{ public: String(const char *str = ""){ if(str == NULL){ data = new char; data[0] = 0; }else{ data = new char[strlen(str) + 1]; strcpy(data, str); } } ~String(){ delete []data; } private: char *data; }; int main(void){ String t1("abcdef"); String t2 = t1; String t3("hello"); t3 = t1; return 0; }
运行结构如下:
可以知道,程序崩了,我们用的是系统默认的拷贝构造函数和赋值语句,此时只是各成员之间的赋值,
两个对象通过默认的拷贝构造,成员data之间相互赋值,使得data不同,data的值相同,指向了同一空间;
此时在最后调用析构函数时,形成了对同一空间的多次释放,是错误操作!!!,这就是浅拷贝。
两个对象通过默认的赋值语句,成员data之间相互赋值,使得data不同,data的值相同,指向了同一空间,浅赋值。
解决方案,此时应给自己写拷贝构造和赋值语句,达成深拷贝:
String(const String &s){ data = new char[strlen(s.data) + 1]; strcpy(data, s.data); } String& operator=(const String &s){ if(this != &s){ delete []data; data = new char[strlen(s.data) + 1]; strcpy(data, s.data); } return *this; }
深拷贝和深赋值的意思:就是重新申请空间,各自保存自己的,最后在自己释放自己的,保证了对内存访问的安全性;
深赋值应当注意以下四步:
(1)、判断自己是否给自己赋值
(2)、释放原有空间 //有可能在构造对象时,已经指向了某一空间,此时就得先释放,不然就内存泄漏
(3)、申请空间进行赋值
(4)、返回引用空间
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
本文名称:C++中的默认函数深拷贝与浅拷贝深赋值与浅赋值-创新互联
本文路径:http://myzitong.com/article/cohsod.html