c++深复制与浅复制区别代码示范vs2015-txwtech
c++深复制与浅复制区别代码示范
区别:
深复制:
CDemo B = A;
B.str[0] = 'K';//B对象里面的元素修改后,A里面不会发生改变。
//--------深复制-----------复制构造函数
CDemo(CDemo &obj1)
{
this->a = obj1.a;
this->str = new char[1024];//用new关键字动态分配内存,就是深复制。
if (str!=0)
{
strcpy(this->str,obj1.str);
}
}
浅复制:
因为调用是隐藏的,看不见的,默认的,自动生成的,复制构造函数。
CDemo B = A;
B.str[0] = 'K';//B对象里面的元素修改后,A里面一起发生改变。
//---------浅复制-----------复制构造函数
CDemo(CDemo& obj)
{
this->a = obj.a;
this->str = obj.str;//这句是浅复制
}
//在测试时,分别屏蔽浅复制与深复制,查看结果。txwtech
//自己写了复制构造函数,必须写析构函数释放指针
————————————————
版权声明:本文为CSDN博主「txwtech」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/txwtech/article/details/103308170
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <iostream> 3 4 5 using namespace std; 6 class CDemo 7 { 8 public: 9 CDemo(int pa, char *cstr) 10 { 11 this->a = pa; 12 this->str = new char[1024];//传递指针,必须使用new动态开辟一块空间 13 strcpy(this->str,cstr); 14 15 } 16 //如下是隐藏的,看不见的,默认的,自动生成的,复制构造函数,这个是 17 18 //---------浅复制----------- 19 //CDemo(CDemo& obj) 20 //{ 21 // this->a = obj.a; 22 // this->str = obj.str;//这句是浅复制 23 // 24 //} 25 //在测试时,分别屏蔽浅复制与深复制,查看结果。txwtech 26 27 //写成深复制构造函数,自己写出来--- 28 29 //--------深复制----------- 30 CDemo(CDemo &obj1) 31 { 32 this->a = obj1.a; 33 this->str = new char[1024];//用new关键字动态分配内存,就是深复制。 34 if (str!=0) 35 { 36 strcpy(this->str,obj1.str); 37 } 38 } 39 //自己写了复制构造函数,必须写析构函数释放指针 40 ~CDemo() 41 { 42 delete str; 43 } 44 45 46 47 public: 48 int a; 49 char *str; 50 51 52 //private: 53 54 }; 55 56 57 58 int main() 59 { 60 CDemo A(10,"hello1"); 61 cout << A.a << "," << A.str << endl; 62 CDemo B = A; 63 B.str[0] = 'K';// 64 //如果复制B.str="abcde";一个字符串,A的值不会变。 65 //cout << "修改B的一个字符后:B.str[0] = 'K';发现A的值一起变化了" << endl; 66 cout << "A.str is: " << A.str << endl; 67 68 cout << "B.str is : " << B.str << endl; 69 70 getchar(); 71 72 return 0; 73 } 74 75 /*vs2015 严重性 代码 说明 项目 文件 行 禁止显示状态 76 //错误 C4996 'strcpy': This function or variable may be unsafe.Consider using strcpy_s instead.To //disable deprecation, use _CRT_SECURE_NO_WARNINGS.See online help for details.cc12a_demo d : \users//\tt2018\documents\visual studio 2015\projects\cc12a_demo\cc12a_demo\cc12a_demo.cpp 11 77 1.放在#include语句之前,且即放在第一行,前面不能有注释,即真正的第一行;定义下面的宏: 78 79 #define _CRT_SECURE_NO_WARNINGS或 #define _CRT_SECURE_NO_DEPRECATE 80 https://blog.csdn.net/Young__Fan/article/details/79829265 81 82 //https://blog.csdn.net/txwtech/article/details/89765796 */