C++深浅拷贝

来源:互联网 发布:rj45 网络变压器 无灯 编辑:程序博客网 时间:2024/05/24 01:39

简单赋值浅拷贝(只赋值拷贝,不重新分配空间)

#include <iostream>#include <stdlib.h>using namespace std;class String{public:String(char* str = ""):_str(str){}String(const String& str):_str(str._str){}String& operator =(const String& str){if(this != &str){strcpy(_str, str._str);}return *this;}//~String()//由于是赋值拷贝,所以构造和拷贝构造的对象是指向同一空间,调用析构释放两次会程序崩溃//{//if(_str)//{//delete[] _str;//_str = NULL;//}//}void Getstr(){cout<<_str<<endl;}private:char* _str;};int main(){String s1("hello world!");String s2(s1);s1.Getstr();s2.Getstr();return 0;}
深拷贝(重新开辟一块相同大小的空间,然后把目标拷贝过去)

传统写法

#include <iostream>using namespace std;class String{public:String(char* str = ""):_str(new char[strlen(str)+1]){strcpy(_str, str);}String(const String& str):_str(new char[strlen(str._str)+1]){strcpy(_str, str._str);}String& operator =(const String& str)//创建tmp,避免了对自身赋值的再判断{char* tmp = new char[strlen(str._str)+1];strcpy(tmp, str._str);delete[] _str;_str = tmp;return *this;}~String(){if(_str)delete[] _str;}private:char* _str;};int main(){String s1("hello world!");String s2(s1);return 0;}
现代写法
#include <iostream>#include <stdlib.h>using namespace std;class String{public:String(char* str = ""):_str(new char[strlen(str)+1]){strcpy(_str, str);}String(const String& str):_str(NULL){String tmp(str._str);swap(_str, tmp._str);}String& operator =(String s)//参数传值调用一次构造函数,在函数结束时自动调用析构函数进行销毁,简化代码{swap(_str, s._str);return *this;}~String(){if(_str)delete[] _str;}private:char* _str;};int main(){String s1("hello world!");String s2(s1);return 0;}