浅复制
#include <iostream> using namespace std; class Test { private: int x; public: Test(int n) {x=n; } Test(const Test& c){x=c.x; } void show (){cout<<x<<endl;} }; int main() { Test a(100); Test b(a); Test c=a; b.show(); c.show(); return 0; }
有问题吗?
#include <iostream> #include <cstring> using namespace std; class Test { private: int x; char *str; public: Test(int n, char *s) { x=n; strcpy(str,s); //肇事地点,但不是祸端 } Test(const Test& c) { x=c.x; strcpy(str,c.str); } void show () { cout<<x<<","<<str<<endl; } }; int main() { Test a(100,"Hello"); Test b(a); a.show(); b.show(); b.show(); return 0; }
正解——深复制
#include <iostream> #include <cstring> using namespace std; class Test { private: int x; char *str; public: Test(int n, char *s) { x=n; int m=strlen(s)+1; str=new char[m]; strcpy(str,s); } Test(const Test& c) { x=c.x; int m=strlen(c.str); str=new char[m]; strcpy(str,c.str); } ~Test() { delete str; } void show () { cout<<x<<","<<str<<endl; } }; int main() { Test a(100,"Hello"); Test b(a); a.show(); b.show(); b.show(); return 0; }
最危险的修改——貌似对,但一定有机会错
#include <iostream> #include <cstring> using namespace std; class Test { private: int x; char *str; //指针成员 public: Test(int n, char *s){ x=n; str=s; //不用strcpy(str,s); } Test(const Test& c){ x=c.x; str=c.str; } void show (){ cout<<x<<","<<str<<endl; } }; int main() { Test *a; a=new Test(100,"Hello"); Test b(*a); a->show(); b.show(); delete a; b.show(); return 0; }
时间: 2024-09-29 18:36:25